0

私はJavaの世界に不慣れであり、ポリモーフィズムがある場合にJavaがどのメソッドを呼び出すかを決定する方法を理解するのにいくつかの問題があります。この例でどのように機能するかを理解するのを手伝ってもらえますか?コードを試して、結果を確認しました。なぜこのように機能するのか、もっと興味があります。

class A {
    void redef(A a) { System.out.println("[A]"); }
}

class B extends A {
    //@Override
    void redef(B b) { System.out.println("[B]"); }
}

class C extends B {
}

public class Surcharge {
    static void surcharge(A a) { System.out.println("[A]"); }
    static void surcharge(B b) { System.out.println("[B]"); }

    public static void main(String[] argv) {

        A a = new A() ;
        B b = new B() ;

        A ab = new B();
        C c = new C();

        ab.redef(c); //?
        surcharge(a); //?
        surcharge(b); //?
        surcharge(c); //?
        surcharge(ab); //?
    }
}
4

1 に答える 1

0

メソッドがオーバーロードされている場合 (ここにあるすべてのメソッドと同様)、Java は、宣言された引数の型に最も近いメソッドを使用します。

最初の例では、 object ( ab) が宣言された型 A であり、コンパイラは method についてしか認識していないredef(A a)ため、それが選択されます。

署名が一致しないためredef(B)、 method は method をオーバーライドしないことに注意してください。注釈redef(A)のコメントを外すと、コンパイル エラーが発生します。@Override

2 番目の例では、引数の宣言された型 (A) とのみsucharge(A a)一致するため、これが選択されます。

3 番目の例でsurcharge(B b)は、引数 (B) の宣言された型とより厳密に一致するため、それが選択されます。

4 番目の例も同様です。

最後の例でsurcharge(A a)は、引数 (A) の宣言された型にのみ適用されるため、それが選択されます。

于 2013-03-19T15:03:08.910 に答える