次のコードを見てみましょう。
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
代わりに書かれています。
クラスが含まれる内部クラスのプライベート メソッドを呼び出すことができるという事実は (少なくとも私には) 奇妙に感じるかもしれませんが (なぜそのようにしたのですか?)、しかし私が本当に理解できないのは、ポリモーフィズムがなぜそうしないのかということです。動作しません。
つまり、 fromTest.main()
を呼び出すことができれば、 A.testMethod()
call も呼び出すことは明らか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
か?