我不知道为什么我们需要动态绑定(后期绑定)。假设我们拥有A类和B类,并且B类扩展了A类,现在我们可以编写诸如“ A var = new B();”之类的东西了 现在,假设两个类都包含具有相同签名的方法,例如方法“ cry()”,现在我可以编写“ var.cry()”之类的东西,而现在仅基于“ var”类型,编译器无法绑定正确的编译期间实例“ var”的方法,但是编译器必须检查以下语句是否合法“ A var = new B();”现在,由于必须检查该语句是否合法,因此必须知道“ var”将引用类B的实例,现在,如果知道这一点,则编译器必须能够在编译时绑定正确的方法?
答案 0 :(得分:2)
假设您有
void foo(A someA) {
someA.cry()
}
现在呢?没有人可以预先告诉您传入的A是A还是B!
换句话说,有很多方法可以不在编译时可靠地知道某些对象的确切性质!
答案 1 :(得分:1)
在一般情况下这是不可能的。例如此处:
A var;
if(x) {
var = new A();
} else {
var = new B();
}
var.cry();
在最后一行是未知的,如果var引用的是A或B的实例。