我很困惑,下一个片段有点浪费。我猜都是因为静态内部类和被调用的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
答案 0 :(得分:4)
f()
中的方法A1
被标记为private
。这意味着A2
或A3
继承了 not 。这意味着多态不会在f()
或A2
中找到覆盖方法A3
。但是,由于A1
是一个嵌套类,因此封闭的Main
类仍然可以访问它,因此可以进行编译。结果是A1
被打印了3次。
如果尝试在@Override
中的f()
上放置A2
注释,则会看到错误。如果将f()
更改为public
,protected
,或在A1
中没有访问修饰符(“程序包访问”),则f()
将如您所愿地被继承,这样输出将达到您的期望,并输出A1
,A2
和A3
。