继承内部类的私有方法

Jos*_* D. 0 java inheritance inner-classes private-methods

我们来看下面的代码:

public class Test {

    class A {
        public A() {}

        private void testMethod() {
            System.out.println("A");
        }
    }

    class B extends A {
        public B() { super(); }

        private void testMethod() {
            System.out.println("B");
        }
    }

    public Test() { }

    public A get() {
        return new B();
    }

    public static void main(String[] args) {
        new Test().get().testMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望代码写B.A是写的.

可能会觉得奇怪(至少对我来说)一个类可以调用它包含的内部类的私有方法这一事实(为什么它们会这样做?),但我真正无法理解的是为什么多态不会工作.

我的意思是,如果从Test.main()我们可以称之为A.testMethod()显而易见,我们也称之为呼叫B.testMethod().Java还可以确定对象的动态类型,那么为什么Java调用声明类型的方法而不是动态类型的方法呢?可以检查此行为:

public static void main(String[] args) {
    B b = new Test().new B();
    A a = b;
    b.testMethod(); // writes B
    a.testMethod(); // writes A
}
Run Code Online (Sandbox Code Playgroud)

另外,为什么会发生这种只有在发生Test.A.testMethod()private

SLa*_*aks 5

您期望的行为来自虚拟方法.
私有方法永远不是虚拟的.

相反,您有两个不相关的方法碰巧具有相同的名称.