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

我对Java还不熟悉,因此产生了一些疑问。例如,考虑如下表达式:

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询问是否可以将方法对其括号参数的分派称为动态的。我们都同意不,不行。