0

私はJavaが初めてで、疑問に思っています。たとえば、次のような式を考えてみましょう。

a.method()
a.method("string")

人々はそれらを「動的ディスパッチ」と呼んでいます。しかし、型チェッカーは、という名前のメソッドが objectmethod()で使用できることを確認していると確信しています。method(String a)a

しかし、なぜ「動的」と呼ばれるのでしょうか。静的呼び出しではありませんか?コンパイラがすでにそれを見つけたので?

4

2 に答える 2

7

投稿した例では、動的ディスパッチを使用しません。の作例を掲載しましたMethod Overloading。の場合のメソッド呼び出しの決定はOverloading、コンパイル時に行われます。formal parametersおよびactual arguments渡された に基づいて、どのメソッドを呼び出すかを決定するのはコンパイラです。


Dynamic BindingMethod Overriding実際に呼び出されるメソッドの決定は実行時まで遅延されます。

例: -

class A {
    public void demo() { }
}

class B extends A {
    public void demo() { }
}

public class Test {
    public static void main(String[] args) {
        A a = new B();
        a.demo();   // B class method will be invoked.

        A obj = new A();
        obj.demo();  // A class method will be invoked.
    }
}

どのメソッドが呼び出されるかの決定は、特定の参照が指しているクラス インスタンスに基づいて決定されruntimeます。したがってDynamic Dispatch

于 2012-11-22T18:22:50.833 に答える
1

あなたが示しているコードは、動的ディスパッチ(バインディング)を表現していません。以下のコードを見てください。

class Super {
  public void method() {}
}

class Sub extends Super {
  public void method() {}

  public static void main(String... args) {
    Super inst = new Sub();
    inst.method(); //Sub's method() would be invoked.(Express's Dynamic Dispatch)
  }
}
于 2012-11-22T18:21:31.390 に答える