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

如果我对java方法访问控制应该是这样的:
[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呢? 大家来说说.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值