Ronen氏Hanukayev:
私は奇妙な状況に遭遇した、Aという名前のクラス、および多型の挙動を理解するために、いくつかのメソッドを持つA.プレイを拡張するBという名前のクラスを持っています。
public class Main {
public static void main(String[] args){
B b = new B();
A a = b;
b.f1(a);
}
}
public class A {
.
.
.
public void f1(A a){
if(a instanceof B)
f1((B)a);
else
System.out.println("Nothing");
}
.
.
.
}
public class B extends A {
.
.
.
public void f1(B b){
System.out.println("B::f1(B)");
}
.
.
.
}
実際に起こった(タイプAであるため)私が最初に呼び出されるクラスAでF1を期待しました。私は、ラインF1((B)A)を期待しました。予想通り今ではすべてが行ったまではBのインスタンスであることから、呼び出されます。しかし、私が呼び出される次の方法が代わりにクラスBのF1(B)、Aは上と呼ばれ、スタックオーバーフロー例外が発生し終わったクラスにF1(A)であると考えました。なぜ、クラスBでF1(B)は呼び出されませんでしたか?Bのインスタンスは、呼び出し元であり、パラメータBを型にキャストしました。
彼らは次のとおりでした:
f1(A a)
クラスのインスタンスメソッドですA
。これは、のサブクラスのメソッドの知識を持ちませんA
。したがって、それは呼び出すことはできませんvoid f1(B b)
クラスのB
。そのため、f1((B)a)
実行void f1(A a)
もう一度。
あなたが呼び出したい場合はf1(B b)
、あなたが呼び出す必要がありますf1
クラスのインスタンス変数にB
:
public void f1(A a){
if(a instanceof B) {
B b = (B)a;
b.f1(b);
} else {
System.out.println("Nothing");
}
}