我很困惑,下一个片段有点浪费。我猜都是因为静态内部类和被调用的A1类的功能范围。
如果您有详细说明,请分享!
public class Main {
static class A1 {
private void f() { System.out.println("A1");}
}
static class A2 extends A1 {
public void f() {System.out.println("A2");}
}
static class A3 extends A2 {
public void f() {System.out.println("A3");}
}
public static void main(String[] args) {
A1 a1 = new A1();
a1.f();
a1 = new A2();
a1.f();
a1 = new A3();
a1.f();
}
}
预期:
A1
A2
A3
实际:
A1
A1
A1
最佳答案
f()
中的方法A1
被标记为private
。这意味着它不会被A2
或A3
继承。这意味着多态不会在f()
或A2
中找到覆盖方法A3
。但是,由于A1
是嵌套类,因此封闭的Main
类仍然可以访问它,因此可以进行编译。结果是A1
被打印3次。
如果尝试在@Override
中的f()
上放置A2
批注,则可能会看到错误。如果将f()
更改为public
,protected
,或者在A1
中没有访问修饰符(“程序包访问”),则f()
将如您期望的那样继承,因此输出将如您期望的那样,并输出A1
,A2
和A3
。
关于java - 为什么代码会产生以下结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53856285/