如果我对java方法访问控制应该是这样的:
[img]/upload/attachment/109618/54e5f752-a5b1-39bb-bfac-b179b30cfbab.jpg[/img]
但是我碰到下面的问题:
1.创建一个包含内部类的类:
2.创建一个子类继承父类:
3. 创建子类和父类的对象,看控制台输出:
output:
思考:从最后的输出查看,我的理解是输出内容是FatherInner 的sayOuterClass方法在构造函数中执行产生的效果.
对于Son类的属于protected的say方法是不能被FatherInner的对象调用到的.因为Son和Father属于不同的package.
事实上它竟然执行了.
回顾: java的访问控制室编译时检查的,不是运行时检查的.
问题: 这算不算一个java的bug呢? 大家来说说.
[img]/upload/attachment/109618/54e5f752-a5b1-39bb-bfac-b179b30cfbab.jpg[/img]
但是我碰到下面的问题:
1.创建一个包含内部类的类:
package javabug;
public class Father {
protected Father() {
FatherInner inner = new FatherInner();
inner.sayOuterClass();
}
protected void say() {
System.out.println("I'm Father");
}
private class FatherInner {
void sayOuterClass() {
Father.this.say();
}
}
}
2.创建一个子类继承父类:
package javabug.other;
import javabug.Father;
public class Son extends Father {
public Son() {
super();
}
protected void say() {
System.out.println("I'm Son");
}
}
3. 创建子类和父类的对象,看控制台输出:
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Father father = new Father();
Son demo = new Son();
}
}
output:
I'm Father
I'm Son
思考:从最后的输出查看,我的理解是输出内容是FatherInner 的sayOuterClass方法在构造函数中执行产生的效果.
对于Son类的属于protected的say方法是不能被FatherInner的对象调用到的.因为Son和Father属于不同的package.
事实上它竟然执行了.
回顾: java的访问控制室编译时检查的,不是运行时检查的.
问题: 这算不算一个java的bug呢? 大家来说说.
本文通过一个具体的Java示例,探讨了Java中访问控制的具体实现方式,并针对子类能否调用父类内部类的方法进行了深入讨论。

被折叠的 条评论
为什么被折叠?



