首先我们先来看两个类:Husband.java、Wife.java
public class Husband {
/*
* 对属性的封装
* 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
*/
private String name ;
private String sex ;
private int age ;
private Wife wife;
/*
* setter()、getter()是该对象对外开发的接口
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setWife(Wife wife) {
this.wife = wife;
}
}
public class Wife {
private String name;
private int age;
private String sex;
private Husband husband;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setAge(int age) {
this.age = age;
}
public void setHusband(Husband husband) {
this.husband = husband;
}
public Husband getHusband() {
return husband;
}
}
从上面两个实例我们可以看出Husband里面wife引用是没有getter()的,同时wife的age也是没有getter()方法的。
public class Husband {
public String name ;
public String sex ;
public int age ;
public Wife wife;
}
我们应该这样来使用它:
Husband husband = new Husband();
husband.age = 30;
husband.name = "张三";
husband.sex = "男"; //貌似有点儿多余
但是那天如果我们需要修改Husband,例如将age修改为String类型的呢?你只有一处使用了这个类还好,如果你有几十个甚至上百个这样地方,
你是不是要改到崩溃。如果使用了封装,我们完全可以不需要做任何修改,只需要稍微改变下Husband类的setAge()方法即可。
public class Husband {
/*
* 对属性的封装
* 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
*/
private String name ;
private String sex ;
private String age ; /* 改成 String类型的*/
private Wife wife;
public String getAge() {
return age;
}
public void setAge(int age) {
//转换即可
this.age = String.valueOf(age);
}
/** 省略其他属性的setter、getter **/
}
public class Husband {
/*
* 对属性的封装
* 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
*/
private String name ;
private String sex ;
private int age ; /* 改成 String类型的*/
private Wife wife;
public int getAge() {
return age;
}
public void setAge(int age) {
if(age > 120){
System.out.println("ERROR:error age input...."); //提示錯誤信息
}else{
this.age = age;
}
}
/** 省略其他属性的setter、getter **/
}
public String getSexName() {
if("0".equals(sex)){
sexName = "女";
}
else if("1".equals(sex)){
sexName = "男";
}
else{
sexName = "人妖???";
}
return sexName;
}
关于权限控制:
在《Java编程思想》中讲解了下述的访问权限
public:接口访问权限。也就是说public修饰的成员方法,属性都是可以在任何地方所访问的。
private: 你无法访问 。也就说private修饰的成员方法,属性 都是只能在这个类中被访问,出了这个类以外的地方,你是无法访问到这个类里面的内容,这十分的有用,我们上面的例子代码,因为是public修饰,所以会出现封装不彻底的问题,如果我们的成员变量date用private修饰,那么就会不出现上述的问题。
protected: 继承访问权限。在说到继承访问权限之前,我们思考这样一个问题,我们有一个基类,是需要被继承的。基类中的成员属性,我们是希望能被继承的类所访问,
那么我们是可以把他设定成public,但是一旦这样的话,除了这个继承的类,其他类也会访问到。这个显然不是我们所期望的事情,所以Java引入protected修饰符,
来表示所修饰的部分是能被派生的类所访问的,同时他也能被同一包里面的其他类所访问。
所以,总结一下,如果我们是希望类中的方法和属性能被所有类所访问,就用public,如果只是能被继承的类和同一包内的类所访问就用protected,
如果只是希望在当前类中所访问,不能被其他任何类访问就要用private。