【发布时间】:2012-09-14 14:11:51
【问题描述】:
让我们看下面的代码:
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() 是private 时才会发生这种情况?
【问题讨论】:
标签: java inheritance inner-classes private-methods