让我们看下面的代码:
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();
}
}
我希望该代码能够编写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
}
另外,为什么只有在Test.A.testMethod()
is时才会发生这种情况private
?