本来private的意义在于保护,类实例只能通过public方法对其修改。但是通过public方法拿到private对象的引用,即可对其进行修改,如:public Class Student{
private int age;
public void setAge(age){....}
.....
}public Class StudentManager{
private Student stu;
public Student getStudent(){return stu;}
.....
}main:
StudentManager sm = new StudentManager();
Student stu=sm.getStudent();
stu.setAge(10); 通过getStudent()拿到private的stu之后,就可以对stu进行随便修改,是不是违背了private的本意??
private int age;
public void setAge(age){....}
.....
}public Class StudentManager{
private Student stu;
public Student getStudent(){return stu;}
.....
}main:
StudentManager sm = new StudentManager();
Student stu=sm.getStudent();
stu.setAge(10); 通过getStudent()拿到private的stu之后,就可以对stu进行随便修改,是不是违背了private的本意??
1. Defensive Copy:说的是你不能返回对你想保护的对象的引用,即stu,但是你可以返回一个stu的镜像,也就是你写return (Student) (stu.clone()),这样外部就能获得stu的所有值,但是它们对这个clone所做的任何事都不会影响到stu本身。当然,如果stu内部也包含了类似的返回值,同样要用clone2. Forwarding:你在StudentManager里面实现Student的所有你想让外部调用方法,而方法里面只有一句话。比如你想让外部调用getAge(),那你就在StudentManager里面写 public int getStuAge() { return stu.getAge(); }。当然,getStudent这个方法是要去掉的。另外“Forwarding”这个名字是我自己乱编的,前面的Defensive Copy是借用了Effective Java里的命名
唉~~, 你不会举一反三吗? 如果name 和 age 也不想被改, 申明的时候一样,加上final
唉~~, 你不会举一反三吗? 如果name 和 age 也不想被改, 申明的时候一样,加上final
首先,你要明白是谁在求助,是lz在求助不是我。第二你要明白lz疑惑的到底是什么,你的回答毫无疑问是正确的,但没有起到解除lz疑惑的作用
private的访问权限是该类,除了当前类能使用,其他都不能,也就是说,你这个private变量被修改,是由于你当前类的public方法引起的,而不是它本身。
唉~~, 你不会举一反三吗? 如果name 和 age 也不想被改, 申明的时候一样,加上final
首先,你要明白是谁在求助,是lz在求助不是我。第二你要明白lz疑惑的到底是什么,你的回答毫无疑问是正确的,但没有起到解除lz疑惑的作用即使用final也阻止不了lz所说的那种修改。打个比方你就明白,比方说你的类是一个学籍管理系统,你可以通过getStudent来“取出”某个学生,那么如果你只写get不写set代表什么意思呢?表示你不能冒名顶替,不能把小明换成小红。但是,它并不拒绝用setAge将小明变成10岁,即便你用setName把“小明”改名叫“小红”,但是他的本质还是小明这个人,这就是所谓“只读”。
唉~~, 你不会举一反三吗? 如果name 和 age 也不想被改, 申明的时候一样,加上final
首先,你要明白是谁在求助,是lz在求助不是我。第二你要明白lz疑惑的到底是什么,你的回答毫无疑问是正确的,但没有起到解除lz疑惑的作用你说的很有道理,不过你怎么知道我没解除楼主的疑惑?