为什么代码会产生以下结果?

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。这意味着它 不是 A2A3 继承。这意味着多态性不会在 A2A3 中找到覆盖方法 f()。但是,因为 A1 是一个嵌套的 class,封闭的 Main class 仍然可以访问它,所以它可以编译。结果是A1打印了3次

如果您尝试在 A2 中的 f() 上放置 @Override 注释,您可能会看到错误。如果您将 f() 更改为 publicprotected,或者在 A1 中没有访问修饰符 ("package access"),那么 f() 将像您一样被继承expect,以便输出如您所料,输出 A1A2A3