本帖最后由 yijincheng 于 2016-3-18 20:17 编辑
今天在学习过程中,发现了一个以前没注意到的一个点。
在对某个类(就叫Student吧)的父类Object的equals方法进行重写时,
public boolean equals(Object obj) {
Student s = (Student) obj;
return this.name.equals(s.name) && this.age == s.age;
}
顺利编译通过,没有报错。
然而,我记得name和age都是Student的私有成员。私有成员明明是最神圣不可侵犯的圣女,变量s又不是本对象的this引用,为何可以直接访问s的私有成员?
观察后猜测,也许是因为s 和 this 都是同一个类Student的对象。于是验证猜想,定义了一个除了名字,内容完全一样的另一个类Person。
代码修改为:
public boolean equals(Object obj) {
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.name;
}
这下如愿以偿的报错了。name和age变成not visible了。
于是得出结论,private的保护层级是类的层级上的,而不是对象级的。
即:同一个类的不同对象之间,是可以任意访问对方的私有成员的。
这下private这个原来在我心中的神圣纯洁的形象瞬间崩塌了!哥哥的老婆原来我这个当弟弟的是可以碰的!
然后回去翻书发现,其实教材上在这里的描述是严谨的,并没有错误。只是大多数书并没有强调这个对封装性破坏的隐患、 |
|