【发布时间】:2016-11-04 11:13:02
【问题描述】:
我试图在更深层次上理解动态/静态绑定,我可以说,经过大量阅读和搜索后,我对某些事情感到非常困惑。
好吧,java 对重写的方法使用动态绑定,原因是编译器不知道该方法属于哪个类,对吧? 例如:
public class Animal{
void eat(){
}
class Dog extends Animal{
@Override
void eat(){}
}
public static void main(String[] args[]){
Dog d = new Dog();
d.eat();
}
我的问题是为什么编译器不知道代码引用了 Dog 类 eat() 方法,即使 d 引用被声明为 Dog 类并且 Dog 的构造函数用于在运行时创建实例? 该对象将在运行时创建,但为什么编译器不理解代码引用 Dog 的方法?是编译器的设计问题还是我遗漏了什么?
【问题讨论】:
-
它不知道,因为它不在乎。多态性的重点是开发人员不需要知道调用的实现实际上是什么,
javac几乎不做任何优化,它只是验证你的代码。
标签: java jvm javac dynamic-binding dynamic-dispatch