Cro*_*yer 13 java methods overriding protected
Test.java
package a;
import b.B;
public class Test {
public static void main(String[] v) {
new A().test();
new B().test();
}
}
Run Code Online (Sandbox Code Playgroud)
A.java:
package a;
public class A {
protected void test() { }
}
Run Code Online (Sandbox Code Playgroud)
B.java:
package b;
public class B extends a.A {
protected void test() { }
}
Run Code Online (Sandbox Code Playgroud)
为什么会new B().test()出错?这不会破坏可见性规则吗?
B.test()是不可见的,Test因为它们在不同的包中,但它拒绝调用可见的test()in B超类.
将赞赏与JLS的适当部分的链接.
这不是继承在Java中的工作方式.
如果方法被覆盖,并且重写的方法不可见,则尝试调用它是编译时错误.
您似乎期望Java会自动回退到超类中的方法,但这种情况不会发生.
我稍后会尝试挖掘JLS为什么没有这样做...
问题是,在编译时,您告诉Java,当您没有此类访问权限时,您希望访问类的受保护成员.
如果你这样做了;
A a = new B();
a.test();
Run Code Online (Sandbox Code Playgroud)
然后它将工作,并且重写的方法将运行,因为在编译时Java检查您是否有权访问A.在运行时,提供的对象具有适当的方法,因此执行B test()方法.动态绑定或后期绑定是关键.