我是 Java 新手,我有一些疑问。例如,考虑如下表达式:
a.method()
a.method("string")
人们称它们为“动态调度”。但我确信类型检查器确保命名的方法method()
可method(String a)
用于 object a
。
但是为什么叫“动态”呢?不是静态调用吗?既然编译器已经发现了?
我是 Java 新手,我有一些疑问。例如,考虑如下表达式:
a.method()
a.method("string")
人们称它们为“动态调度”。但我确信类型检查器确保命名的方法method()
可method(String a)
用于 object 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)
}
}