Java动态绑定(bind): Why the compiler cannot distinguish overriden methods

标签 java jvm javac dynamic-binding dynamic-dispatch

我正在尝试更深入地理解动态/静态绑定(bind),我可以说,经过大量阅读和搜索后,我对某些事情感到非常困惑。

嗯,java对重写方法使用动态绑定(bind),其原因是编译器不知道该方法属于哪个类,对吗? 例如:

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 的方法?这是编译器设计的问题还是我遗漏了什么?

最佳答案

and the reason for this is that the compiler doesn't know to which class the method belongs to, right?

事实上,没有。编译器不想知道目标对象的具体类型。这允许现在编译的代码将来可以与尚不存在的类一起使用。

最明显的例子是考虑像 Collections.sort(List) 这样的 JDK 方法。您可以将刚刚创建的 List 的实现传递给它。您不想通知 Oracle 您已执行此操作,并希望他们将其包含在“静态支持”列表类型列表中。

关于Java动态绑定(bind): Why the compiler cannot distinguish overriden methods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40421226/

相关文章:

java - 对于尝试访问不可读文件的 JAVA 程序,unix 看到的用户名是什么

c# - 在c#和java套接字之间读写数据

java - 是否可以在循环中使用单个语句反转链表?

java - jvm什么时候在对象头中赋值hashcode

garbage-collection - Java中的总内存是如何计算的

java - javac 无法优化我的代码吗?

java - 如何在没有应用程序 ID 的情况下访问默认应用程序?

java - SEAM 和 Hibernate 验证

java - 即使运行容器,docker stats 也显示零内存使用

java - 如何从 cmd 运行作为包一部分的 .class 文件?