我很困惑,下一个片段有点浪费。我猜都是因为静态内部类和被调用的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。这意味着它不会被A2A3继承。这意味着多态不会在f()A2中找到覆盖方法A3。但是,由于A1是嵌套类,因此封闭的Main类仍然可以访问它,因此可以进行编译。结果是A1被打印3次。

如果尝试在@Override中的f()上放置A2批注,则可能会看到错误。如果将f()更改为publicprotected,或者在A1中没有访问修饰符(“程序包访问”),则f()将如您期望的那样继承,因此输出将如您期望的那样,并输出A1A2A3

关于java - 为什么代码会产生以下结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53856285/

10-15 14:57