我在“多态性”一章的“ Thinking in Java”中阅读了有关“后期绑定”概念的信息,我只是想知道我对这个概念的理解是否正确
程序语言知道例如在运行时要在哪里执行的功能
if(condition){func1();}else{func2();}
因此,每个可能的函数的地址都是在程序运行之前准确知道的,因此可以轻松地对其进行编译,但是在OOL中,请检查此代码,
makeItSpeak(Animal a ){
a.speak();
}
尽管a可能是狗,猫或任何其他Animal类型,并且由于我们在运行时初始化了对象,所以我们必须在运行时传递运行语音时所基于的参数,因此这是在运行时发生的后期绑定-时间 ....
真的吗 ??
最佳答案
是的,它使用virtual method table实现。
在您的示例中,speak()
是一个没有物理地址的虚拟(抽象)方法。在运行时,基于具体的Animal
子类的类型,运行时通过引用虚拟方法表来找出要调用的speak()
实现。