Java 为什么它称为动态绑定,而不是静态绑定?
我对Java还不熟悉,因此产生了一些疑问。例如,考虑如下表达式:Java 为什么它称为动态绑定,而不是静态绑定?,java,compiler-construction,Java,Compiler Construction,我对Java还不熟悉,因此产生了一些疑问。例如,考虑如下表达式: a.method() a.method("string") 人们称之为动态调度。但我确信类型检查器确保名为method、methodString a的方法可用于对象a 但为什么称之为动态?这不是静态呼叫吗?因为编译器已经发现了?您正在显示的代码并不表示动态dispatchbinding。请查看下面的代码 class Super { public void method() {} } class Sub extends Su
a.method()
a.method("string")
人们称之为动态调度。但我确信类型检查器确保名为method、methodString a的方法可用于对象a
但为什么称之为动态?这不是静态呼叫吗?因为编译器已经发现了?您正在显示的代码并不表示动态dispatchbinding。请查看下面的代码
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)
}
}
您发布的示例将不使用动态分派。您已经发布了一个方法重载的示例。在重载的情况下,方法调用的决定在编译时完成。编译器根据形式参数和传递的实际参数来决定调用哪个方法 当您使用方法重写时,动态绑定就开始发挥作用,其中实际调用哪个方法的决定将延迟到运行时 例如:-
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.
}
}
调用哪个方法的决定取决于特定引用所指向的类实例,这只有在运行时才知道。这就是动态调度。到底是谁在称这种动态调度?可能还有更多的上下文,比如被重写的方法,因为该部分是动态的。重载的确定是静态的,但潜在的多态代码是动态的。我向您保证,主体称之为动态分派。除非他们不知道自己在说什么。@pst括号内参数的分派不是动态的,这就是OP所要问的,不是吗?@pst当我们显然在所有问题上都一致时,除了OP实际要问的问题:是的,Java是动态分派语言,但是OP询问是否可以将方法对其括号参数的分派称为动态的。我们都同意不,不行。