为什么它称为动态绑定,而不是静态绑定?

时间:2012-11-22 18:17:09

标签: java compiler-construction

我是Java的新手,我对此表示怀疑。例如,考虑表达式:

a.method()
a.method("string")
人们称他们为“动态调度”。但我确信类型检查器确保名为method()method(String a)的方法可用于对象a

但为什么称它为“动态”?这不是静态通话吗?既然编译器已经发现了吗?

2 个答案:

答案 0 :(得分:7)

您发布的示例不会使用动态分派。您已发布了Method Overloading的示例。在Overloading的情况下,方法调用的决定是在编译时完成的。编译器根据formal parametersactual 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)
  }
}