锁定老帖子 主题:对java方法的访问控制的深思考
精华帖 (0) :: 良好帖 (0) :: 新手帖 (11) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-01
最后修改:2009-06-02
删除此回复
|
|
返回顶楼 | |
发表时间:2009-06-02
最后修改:2009-06-03
哈哈,楼上删,我也删 ---------------------
|
|
返回顶楼 | |
发表时间:2009-06-02
最后修改:2009-06-04
seraphim871211 写道 删除此回复
嗯嘛。Java的protected经常被讨论就是因为它跟C++和C#等的protected语义不同,在同package内也可见…… 不过楼主在理解Java的方法与多态的时候可能不够仔细?Java中的方法,只要不是static、private或final的,都可以表现出其多态性。继承类的时候,如果覆盖虚方法,则可见性要大于等于基类上的方法的;这样就保证了基类所定下的“契约”要被派生类所实现。在FatherInner里对Father.this.say()的调用是一个对虚方法的调用,只要在这个调用点上FatherInner能看到Father,就可以调用其say()方法,但因为是虚方法调用,实际调用的版本并不一定是Father上的实现,而会根据“this”的实际类型选择最具体的类的实现版本。从Son的角度看,这一切都是透明的;FatherInner类的存在对Son不可见,只是Father的实现细节而已。 修改:同步删除引用的回复 XD |
|
返回顶楼 | |
发表时间:2009-06-02
netfork 写道 “对于Son类的属于protected的say方法是不能被FatherInner的对象调用到的.因为Son和Father属于不同的package. ” 这句话似乎说明,楼主把继承关系理解为对象间的访问规则。 父类如果有say的抽象方法是可以的.楼主的这种继承毫无意义. 类的继承使用羡慕的层次结构的,本人不推荐用方法重载的方式,对于这种情况我情愿剥离一个不能再分割的父类 用抽象方法进行定义需要重载的方法. 几点要注意 1.如果是构造函数是private的 建议类定义为final . 2.如果父类需要调用子类的某些方法的时候可以考虑运用抽象方法. 3.要考虑父类和子类的方法是否冲突.(这里的冲突是指是否存在两个同样的方法能够改变共享数据) 4.防止死循环,这种情况发送在 父类 A public void testA(){ /// } 子类 B public void testA(){ this.testA();//正确的应该是super.testA(); } 像楼主对super和this不清楚的就会发生这种情况了. |
|
返回顶楼 | |
发表时间:2009-06-02
思考:从最后的输出查看,我的理解是输出内容是FatherInner 的sayOuterClass方法在构造函数中执行产生的效果.
对于Son类的属于protected的say方法是不能被FatherInner的对象调用到的.因为Son和Father属于不同的package. 事实上它竟然执行了. 楼主对于访问控制还有些欠缺。 事实上楼主总结的很全, protected类型可以被同包的类访问,以及任何包的子孙类访问。 |
|
返回顶楼 | |
发表时间:2009-06-03
protected可以在不同包被继承,现在重写的say方法,当然可以执行啦
|
|
返回顶楼 | |
发表时间:2009-06-03
简单的问题搞得那么复杂.你的内部类在问题没出现到,干嘛写上去...
就是protected的继承问题 不同包直接访问是不行,但是可以重写super.say()后再升级protected为public就可以直接访问. |
|
返回顶楼 | |
发表时间:2009-06-03
最后修改:2009-06-03
friendly?从C++转过来的?
公开的 私有的 一个家族的 一个社区的 流氓一点的 什么作用域不作用域的 一反射 全是浮云 |
|
返回顶楼 | |
发表时间:2009-06-03
在父类的say()方法里面打印下this你就知道怎么回事了,其实是多态。
|
|
返回顶楼 | |
发表时间:2009-06-04
楼主为什么认为protected不能被不同package的子类访问呢?
protected的类、类属变量及方法可以被包内的任何类,及包外的那些继承了此类的子类访问 如果把Father和Son中的protected void say()改成void say()再试试结果是 引用 I'm Father
I'm Father |
|
返回顶楼 | |