私はJavaが初めてで、疑問に思っています。たとえば、次のような式を考えてみましょう。
a.method()
a.method("string")
人々はそれらを「動的ディスパッチ」と呼んでいます。しかし、型チェッカーは、という名前のメソッドが objectmethod()
で使用できることを確認していると確信しています。method(String a)
a
しかし、なぜ「動的」と呼ばれるのでしょうか。静的呼び出しではありませんか?コンパイラがすでにそれを見つけたので?
私はJavaが初めてで、疑問に思っています。たとえば、次のような式を考えてみましょう。
a.method()
a.method("string")
人々はそれらを「動的ディスパッチ」と呼んでいます。しかし、型チェッカーは、という名前のメソッドが objectmethod()
で使用できることを確認していると確信しています。method(String a)
a
しかし、なぜ「動的」と呼ばれるのでしょうか。静的呼び出しではありませんか?コンパイラがすでにそれを見つけたので?
投稿した例では、動的ディスパッチを使用しません。の作例を掲載しましたMethod Overloading
。の場合のメソッド呼び出しの決定はOverloading
、コンパイル時に行われます。formal parameters
およびactual arguments
渡された に基づいて、どのメソッドを呼び出すかを決定するのはコンパイラです。
Dynamic Binding
Method 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
。
あなたが示しているコードは、動的ディスパッチ(バインディング)を表現していません。以下のコードを見てください。
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)
}
}