我是Java的新手,我对此表示怀疑。例如,考虑表达式:
a.method()
a.method("string")
人们称他们为“动态调度”。但我确信类型检查器确保名为method()
,method(String a)
的方法可用于对象a
。
但为什么称它为“动态”?这不是静态通话吗?既然编译器已经发现了吗?
答案 0 :(得分:7)
您发布的示例不会使用动态分派。您已发布了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
。
答案 1 :(得分: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)
}
}