2016-11-01 5 views
-3
class A { 
    void meth(A a) { System.out.println("A a.meth() called"); } 
    void meth(D d) { System.out.println("A d.meth() called"); } 
    void meth(E e) { System.out.println("A e.meth() called"); } 
} 

class D {} 

class E extends D {} 

class B extends A { 
    void meth(A a) { System.out.println("B a.meth() called"); } 
    void meth(B b) { System.out.println("B b.meth() called"); } 
    void meth(D d) { System.out.println("B d.meth() called"); } 
    void meth(E e) { System.out.println("B e.meth() called"); } 
} 


public class OverldOverd { 
    public static void main (String[] args) { 
     B b = new B(); 
     A a = b; 

     a.meth(a); // B a.meth() called 
     a.meth(b); // B a.meth() called /*! Why? !*/ 
    } 
} 

私はこの行を理解しようとしています:Javaのオーバーロード&オーバーライド関数呼び出し

a.meth(b); 

は、ここに私のアルゴリズムです:Aは、静的な型Aとダイナミック型Bを持っているので、私たちはクラスに階層を下りますB.また、引数の静的型、すなわち。 bはBなので、代わりに出力する必要があります:

B b.meth() called 

明らかに私は間違っています。私はこれを理解しようとしています。誰かが私がどこが間違っているのか理解するのを助けることができる?私のアルゴリズムが間違っていたら私に知らせてください。前もって感謝します。

答えて

3

クラスAmeth(B a)を持っていないので、あなたはクラスBに、このメソッドを追加するとき、それは(もないmeth(A a)クラスAから)何かを上書きしません。

コンパイルa.meth(b)コンパイラは、B引数型に最も合った方法を選びます。 B extends Ameth(A a)が選ばれています。あなたは(ダイナミックの結合を介して)a.meth(b) polymoprhismを実行

はあなたのケースでBあるaを保持するオブジェクトの実際の型からmeth(A a)を呼び出します。だからあなたは見るB a.meth() called

関連する問題