覆盖Java中的受保护方法

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的适当部分的链接.

paj*_*ton 12

在这里你可以找到关于protected关键字的JLS: JLS受保护的描述受JLS保护的示例.

基本上是一个protected修改意味着可以访问字段/方法/ ... 1)中给出的类的子类,并从类2)在同一封装中.

因为2)new A().test()工作.但是new B().test()不起作用,因为课程B在不同的包中.


sle*_*ske 7

这不是继承在Java中的工作方式.

如果方法被覆盖,并且重写的方法不可见,则尝试调用它是编译时错误.

您似乎期望Java会自动回退到超类中的方法,但这种情况不会发生.

我稍后会尝试挖掘JLS为什么没有这样做...


Vin*_*nie 7

问题是,在编译时,您告诉Java,当您没有此类访问权限时,您希望访问类的受保护成员.

如果你这样做了;

  A a = new B();
  a.test();
Run Code Online (Sandbox Code Playgroud)

然后它将工作,并且重写的方法将运行,因为在编译时Java检查您是否有权访问A.在运行时,提供的对象具有适当的方法,因此执行B test()方法.动态绑定或后期绑定是关键.