なぜパラメータとして父のクラスを取得するメソッドは、パラメータとして子クラスを取得するメソッドと呼ばれていませんか?

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");
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=200081&siteId=1