2011-12-06 16 views
-2
class a extends b { 
    void h() { 
     System.out.println("class a"); 
    } 
    public static void main(String[]args) { 
     b x = new a(); 
     c y = new b(); 
     c z = new a(); 

     x.h();  //output class a 
     y.h();  //output class b 
     z.h();  //output class a 
    } 
} 

class b extends c { 
    void h() { 
     System.out.println("class b"); 
    } 
} 
class c { 
    void h() { 
     System.out.println("class c"); 
    } 
} 

どのメソッドを呼び出すかを調べる優先順位は何ですか?動的ディスパッチを使用するときにどのメソッドを呼び出すかをJVMが決定する方法については混乱しています。この場合の出力は動的ディスパッチの場合、オーバーライドされたメソッドの呼び出しはどのように行われますか

class a 
class b 
class a 

と私はクラスからオーバーライドされたメソッドを削除すると出力が使用するクラスがインスタンス化タイプに依存

class b 
class b 
class b 
+0

スペースを少しきれいにしてください。 –

+2

このコードはコンパイルされません。「b x = new a();」は不正です。 – Puppy

+0

私はちょうどeclipseから貼り付けたコードをコピーしてください... – Nav

答えて

4

あります。したがって、クラスaのインスタンスが(new a()を介して)ある場合、宣言された変数の型がa、b、またはcであるかどうかは、h()のどの定義を呼び出すのかは関係ありませんah()を呼び出します)。

しかし、宣言された型が問題となる場所は、オーバーロードされたメソッドを選択するときです。オーバーライドされたメソッドをオーバーロードするサブクラスがある場合、親クラスとして宣言された変数から呼び出すときは、オーバーロードされたメソッドを使用しません。サブクラスであると宣言された変数を使用する場合は、適切にオーバーロードされたメソッドを使用します。

+0

編集者と一緒に教えてください – Nav

+0

親クラスのオブジェクトにサブクラスの参照を保存しているので、オブジェクトの型を考慮しません: o ...動的ディスパッチ中に、オブジェクト型に応じてメソッドを呼び出すと思いました。それを指摘してくれたことありがとうございました – Nav

+0

インスタンス化された型のメソッドを(常に継承またはオーバーライドされていてもいなくても)呼び出します。宣言された型(宣言された型にメソッドが存在すると仮定)。ただし、メソッドがサブタイプでオーバーロードされている場合は、宣言されたオブジェクトの型が重要になります(親の型から宣言されたインスタンスからの呼び出しは、オーバーロードされたメソッドを使用しません。 )。 –

関連する問題