2013-02-25 5 views
6

を呼び出すメソッドとキャストは、両方の方法は、プリントアウト1を呼び出していないのはなぜ私が1から第二の方法の呼び出しを印刷しながら、2から以下のクラスJavaは

class A{ 
    public method(A a) { 
     System.out.println(3); 
    } 
} 

class B extends A{ 
    public void method (A a) { 
     System.out.println(2); 
    } 
    public void method (B b) { 
     System.out.println(1); 
    } 
} 

A obj = new B(); 
obj.method((B) obj); 
((B) obj).method((B) obj); 

最初のメソッド呼び出しのプリントを持っていると仮定しますか?

+0

コードはそのままコンパイルされないことに注意してください。 –

答えて

3

javaはコンパイル時に呼び出すメソッドを選択するためです。コンパイラは、割り当ての「左側」のみを考慮に入れます。

したがって、A obj = new B()と入力すると、コンパイラはクラスAのメソッドのみを見ます。 Bの

+0

まあ...コンパイラは、そのようなメソッドが定義されているだけを見ていますが、オブジェクトのメソッドを呼び出します。このメソッドは、同じ引数を持つ同じメソッドを持つため、クラスBのメソッドを呼び出します。これはjavaのすべてのメソッドが仮想なので起こります。 –

4

void method (B b)obj.method((B) obj);で、objの種類が多型ルールでそれだけでクラスB

class B extends A { 

    // This is an overridden method visible to A 
    public void method(A a) { 
     System.out.println(2); 
    } 

    // This is an overloaded method unknown from A 
    public void method(B b) { 
     System.out.println(1); 
    } 
} 
void method(A a)バージョンを呼び出すことができているので、それは論理的だ親A.

のために全く不明です

You can read this SO answer which explained Override vs. Overload.

1

最初のメソッド呼び出しは、タイプAのオブジェクト参照を使用して行われるので、オーバーライドすることができ、対応する方法は、呼び出され。最初のキャストがBを入力するために行われる第2のケースで

、クラスBに定義されているので、対応する方法、すなわち、

method (B b) 

が呼び出されます。