为什么需要动态绑定?

Why is dynamic binding necessary?

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

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

A var;

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

var.cry();

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

假设你有

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

}

现在怎么办?没有人可以预先告诉您传入的 A 是 A 还是 B!

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