2011-12-21 29 views
0

メソッドbar()を定義するクラスAがあるとします。メソッドbar()は別のメソッドfoo()を呼び出します。私はABに広げ、foo()を上書きし、bar()を上書きしない(継承する)。これらの2つのケースでどちらがfoo()と呼ばれていますか?Javaでの動的ディスパッチ

A a = new B(); 
a.bar(); // A or B's foo called? 

B b = new B(); 
b.bar(); // A or B's foo called? 

答えて

3

どちらもBのfoo()を使用します。 AはBがインスタンスであるため、Bのメソッドにアクセスしています。

この場合、例えばインタフェースとしてAを考える:新しいB()

ここで(Groovyで)例を示します。

http://groovyconsole.appspot.com/script/616002
0

それがためにBのfooメソッドを呼び出します両方の場合。 javaでは、すべてのメソッド呼び出しが動的にディスパッチされます。呼び出す参照やコンテキストに関係なく、メソッドの呼び出しはオブジェクトのタイプに基づいて行われます。

+1

この場合、あなたが言っていることは本当ですが、私は "すべてのメソッド呼び出しが動的にディスパッチされます"と注意しています。 Javaには複数のディスパッチがありません。たとえば、オーバーロードされたメソッドがある場合、渡された引数の実行時の型に基づいて、呼び出されるメソッドは動的ではありません。 –

+0

メソッドが呼び出されるオブジェクトの型に基づいています議論の – gkamal

0

メソッド呼び出しは、メソッドが呼び出されるオブジェクトの型にのみ依存し、呼び出すために使用される参照型には依存しません。

どちらの場合も、タイプBのオブジェクトのメソッドが呼び出されるため、両方ともBのfoo()を呼び出します。

class C { 
    public void foo() { 
     System.out.println("foo in C"); 
    } 

    public void bar() { 
     System.out.println("calling foo"); 
     foo(); 
    } 
} 


class B extends C { 
    public void foo() { 
     System.out.println("foo in B"); 
    } 
} 


public class A { 


    public static void main(final String[] args) { 
     C c = new B(); 
     c.bar(); // C or B's foo called? 

     B b = new B(); 
     b.bar(); // C or B's foo called? 

    } 

、出力がある:

calling foo 
foo in B 
calling foo 
foo in B 
1
A a = new B();

B b = new B();

BBクラス両時間Bののfoo()のインスタンスでありますメソッドが呼び出されます。

方法は、子クラスでオーバーライドされた場合(この場合には、Bクラス)は、子オブジェクトのインスタンスは、親のクラスでは、それ自身のクラスではないに存在するそのメソッドを呼び出しますので(この場合は、クラス) 。

関連する問題