我在“多态性”一章的“ Thinking in Java”中阅读了有关“后期绑定”概念的信息,我只是想知道我对这个概念的理解是否正确

程序语言知道例如在运行时要在哪里执行的功能

if(condition){func1();}else{func2();}


因此,每个可能的函数的地址都是在程序运行之前准确知道的,因此可以轻松地对其进行编译,但是在OOL中,请检查此代码,

makeItSpeak(Animal a ){
  a.speak();
}


尽管a可能是狗,猫或任何其他Animal类型,并且由于我们在运行时初始化了对象,所以我们必须在运行时传递运行语音时所基于的参数,因此这是在运行时发生的后期绑定-时间 ....

真的吗 ??

最佳答案

是的,它使用virtual method table实现。

在您的示例中,speak()是一个没有物理地址的虚拟(抽象)方法。在运行时,基于具体的Animal子类的类型,运行时通过引用虚拟方法表来找出要调用的speak()实现。

10-07 22:16