论坛首页 Java企业应用论坛

对java方法的访问控制的深思考

浏览 10777 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (11) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-01   最后修改:2009-06-02
删除此回复
0 请登录后投票
   发表时间:2009-06-02   最后修改:2009-06-03
哈哈,楼上删,我也删 ---------------------
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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不清楚的就会发生这种情况了.

0 请登录后投票
   发表时间:2009-06-02  
思考:从最后的输出查看,我的理解是输出内容是FatherInner 的sayOuterClass方法在构造函数中执行产生的效果.
对于Son类的属于protected的say方法是不能被FatherInner的对象调用到的.因为Son和Father属于不同的package.
事实上它竟然执行了.


楼主对于访问控制还有些欠缺。
事实上楼主总结的很全, protected类型可以被同包的类访问,以及任何包的子孙类访问。

0 请登录后投票
   发表时间:2009-06-03  
protected可以在不同包被继承,现在重写的say方法,当然可以执行啦
0 请登录后投票
   发表时间:2009-06-03  
简单的问题搞得那么复杂.你的内部类在问题没出现到,干嘛写上去...
就是protected的继承问题
不同包直接访问是不行,但是可以重写super.say()后再升级protected为public就可以直接访问.
0 请登录后投票
   发表时间:2009-06-03   最后修改:2009-06-03
friendly?从C++转过来的?


公开的
私有的
一个家族的
一个社区的

流氓一点的
什么作用域不作用域的
一反射
全是浮云
0 请登录后投票
   发表时间:2009-06-03  
在父类的say()方法里面打印下this你就知道怎么回事了,其实是多态。
0 请登录后投票
   发表时间:2009-06-04  
楼主为什么认为protected不能被不同package的子类访问呢?

protected的类、类属变量及方法可以被包内的任何类,及包外的那些继承了此类的子类访问

如果把Father和Son中的protected void say()改成void say()再试试结果是
引用
I'm Father
I'm Father
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics