讓我們以下面的代碼:繼承的內部類的私有方法
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
?