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

时间:2018-12-19 17:20:08

标签: java oop inheritance polymorphism inner-classes

我很困惑,下一个片段有点浪费。我猜都是因为静态内部类和被调用的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

1 个答案:

答案 0 :(得分:4)

f()中的方法A1被标记为private。这意味着A2A3继承了 not 。这意味着多态不会在f()A2中找到覆盖方法A3。但是,由于A1是一个嵌套类,因此封闭的Main类仍然可以访问它,因此可以进行编译。结果是A1被打印了3次。

如果尝试在@Override中的f()上放置A2注释,则会看到错误。如果将f()更改为publicprotected,或在A1中没有访问修饰符(“程序包访问”),则f()将如您所愿地被继承,这样输出将达到您的期望,并输出A1A2A3

相关问题