为什么代码会产生以下结果?
Why does the code produce the following result?
我对下一个片段感到困惑和有点浪费。我想这都是因为 static inner class 和调用的 class 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
A1
中的方法f()
被标记为private
。这意味着它 不是 由 A2
或 A3
继承。这意味着多态性不会在 A2
或 A3
中找到覆盖方法 f()
。但是,因为 A1
是一个嵌套的 class,封闭的 Main
class 仍然可以访问它,所以它可以编译。结果是A1
打印了3次
如果您尝试在 A2
中的 f()
上放置 @Override
注释,您可能会看到错误。如果您将 f()
更改为 public
、protected
,或者在 A1
中没有访问修饰符 ("package access"),那么 f()
将像您一样被继承expect,以便输出如您所料,输出 A1
、A2
和 A3
。
我对下一个片段感到困惑和有点浪费。我想这都是因为 static inner class 和调用的 class 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
A1
中的方法f()
被标记为private
。这意味着它 不是 由 A2
或 A3
继承。这意味着多态性不会在 A2
或 A3
中找到覆盖方法 f()
。但是,因为 A1
是一个嵌套的 class,封闭的 Main
class 仍然可以访问它,所以它可以编译。结果是A1
打印了3次
如果您尝试在 A2
中的 f()
上放置 @Override
注释,您可能会看到错误。如果您将 f()
更改为 public
、protected
,或者在 A1
中没有访问修饰符 ("package access"),那么 f()
将像您一样被继承expect,以便输出如您所料,输出 A1
、A2
和 A3
。