在 Java 中重写受保护的方法

2022-09-04 07:38:13

测试.java

package a;
import b.B;
public class Test {
    public static void main(String[] v) {
        new A().test();
        new B().test();
    }
}

答.java:

package a;
public class A {
    protected void test() { }
}

乙.java:

package b;
public class B extends a.A {
    protected void test() { }
}

为什么给出错误?这难道不会违反可见性规则吗?new B().test()

B.test()是看不见的,因为它们在不同的包中,但它拒绝调用 in 的超类,这是可见的。Testtest()B

如能提供与JLS适当部分的链接,将不胜感激。


答案 1

在这里,你去JLS关键字:JLS受保护的描述JLS受保护的示例protected

基本上,修饰符意味着您可以访问字段/方法/...1) 在给定类的子类中2) 来自同一包中的类。protected

因为2)工作。但不起作用,因为类位于不同的包中。new A().test()new B().test()B


答案 2

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

如果你这样做了;

  A a = new B();
  a.test();

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