A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yijincheng 中级黑马   /  2016-3-18 14:14  /  418 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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这个原来在我心中的神圣纯洁的形象瞬间崩塌了!哥哥的老婆原来我这个当弟弟的是可以碰的!

然后回去翻书发现,其实教材上在这里的描述是严谨的,并没有错误。只是大多数书并没有强调这个对封装性破坏的隐患、

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马