【问题标题】:Why does it called dynamic binding, rather than static binding?为什么叫动态绑定,而不是静态绑定?
【发布时间】:2012-11-22 18:17:08
【问题描述】:

我是 Java 新手,我有一些疑问。例如,考虑如下表达式:

a.method()
a.method("string")

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

但是为什么叫“动态”呢?不是静态调用吗?既然编译器已经发现了?

【问题讨论】:

  • 究竟是谁在调用这个动态调度?也许有更多的上下文(例如被覆盖的方法,因为那部分动态的。
  • 重载判断是static,但潜在的多态代码是dynamic
  • 没有人称其为“动态调度”,让我向你保证。除非他们不知道自己在说什么。
  • @pst 括号内参数的调度不是动态的,这就是 OP 所要求的,不是吗?
  • @pst 当我们显然同意除了 OP 实际要求的所有内容时,没有必要争论 :) 是的,当然,Java 是一种动态调度语言,但 OP 询问 method 的调度是否在它带括号的参数可以称为“动态”。我们俩都同意不,它不能。

标签: java compiler-construction


【解决方案1】:

您发布的示例不会使用动态调度。您发布了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

【讨论】:

    【解决方案2】:

    您显示的代码没有表达动态调度(绑定)。请看下面的代码。

    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)
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      相关资源
      最近更新 更多