【问题标题】:Why is dynamic binding necessary?为什么需要动态绑定?
【发布时间】:2019-10-19 19:10:41
【问题描述】:

我不明白为什么我们需要动态绑定(后期绑定)。假设我们有 A 类和 B 类,并且假设 B 类扩展了 A 类,现在我们可以编写诸如“A var= new B();”之类的东西 现在假设两个类都包含具有相同签名的方法,例如方法“cry()”现在我可以编写类似“var.cry()”的东西,现在仅基于“var”的类型编译器无法绑定权利编译期间实例“var”的方法,但编译器必须检查以下语句是否合法“A var= new B();”现在,因为它必须检查该语句是否合法,它必须知道“var”将引用类 B 的实例,现在如果它知道这一点,编译器必须能够在编译时绑定正确的方法?

【问题讨论】:

  • 编译器检查当你分配它时它是有效的,当你调用一个方法时它是有效的。在一般情况下,没有办法消除这两个检查之间的分裂。因此后期绑定。

标签: java dynamic-binding


【解决方案1】:

假设你有

void foo(A someA) {
  someA.cry()

}

现在呢?没有人能提前告诉你传入的 A 是 A 还是 B!

换句话说,有很多方法可以在编译时可靠地知道某个对象的确切性质!

【讨论】:

    【解决方案2】:

    这在一般情况下是不可能的。例如这里:

    A var;
    
    if(x) {
        var = new A();
    } else {
        var = new B();
    }
    
    var.cry();
    

    在最后一行是未知的,如果 var 引用了 A 或 B 的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多