2017-09-30 13 views
-1

ここで、このコードは静的ディスパッチかダイナミックディスパッチを使用していますか?Javaでの静的ディスパッチ

public class Survey 
{ 
    public void DoSurvey() 
    { 
     System.out.println("DoSurvey is called"); 
    } 
} 


Survey survey = new Survey(); 
survey.DoSurvey(); 

Javaは、民間最終静的、参照調査に割り当てられているオブジェクトを意味まだ実行時に決定され呼び出されるメソッドは、実行時に検査されている以外のすべてのメソッドの動的ディスパッチを使用するため正しいメソッドが呼び出されます。それでも、コンパイラが参照調査の型を持ち、関数を呼び出すことが正当なものであるかどうかをチェックできる初期バインディングが使用されます。次に、その関数は、基礎となるオブジェクトの性質がチェックされると、実行時に動的にディスパッチされます。私の理解は正しいのですか?また、静的なディスパッチが使用される例は何ですか?

+1

上記の静的なものは何ですか?これは動的ディスパッチの例です。 publicの後にstaticキーワードを追加し、実装全体の魔法を見ます。 Btw C#!= java – SMA

+0

投稿を修正しました。私の間違いです。今見ます。 – LearningMath

答えて

0

この醜いコードは(静的メソッドは、変数を経由して呼ばれている)いくつかの静的っぽい派遣を表示します。私は、静的発送です主張を」あえてしないでしょうしかし

public class Parent { 
    public static void statictest(){System.out.println("Parent.statictest");} 
    public void test(){System.out.println("Parent.test");} 
} 
public class Child extends Parent { 
    public static void statictest(){System.out.println("Child.statictest");} 
    public void test(){System.out.println("Child.test");} 
} 
public static void main(String[] args) { 
    Child c=new Child(); 
    Parent p=c; 
    c.test(); 
    p.test(); 
    c.statictest(); 
    p.statictest(); 
} 

Child.test 
Child.test 
Child.statictest 
Parent.statictest 

になりますなぜなら、特に署名が互いに関連している(つまり、あるものが他のものから継承する)引数型が異なる場合、私はオーバーロードの場合に起こることを考えなかったからです。

+0

これは純粋な静的ディスパッチではどうですか?呼び出される静的メソッドは、呼び出されるオブジェクトのタイプに基づいてコンパイル時に決定されます。それは静的なディスパッチです。 testを呼び出すと、呼び出されるメソッドの実装が実行時に決定されるため、動的ディスパッチが発生します。そのため、pでtestを呼び出すとChild.testが出力されます(実際のオブジェクトはChildで、動的ディスパッチはテストchildで提供されるメソッド)。 – LearningMath

+0

あなたはもっと詳しく説明できますか?私はあなたのことを理解していないようです。ありがとう。 – LearningMath

+0

@LearningMathはい、これは静的なディスパッチです。私は、私が書いたことを意味していました。継承、インターフェース、オーバーロードのすべての可能な(ab)使用を考えなかったのです。これは「良い」コードでもない単なるスニペットの一例です。 – tevemadar