jvm 静态和动态多态之间发生了什么[关闭]

nmpmafwu  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(49)

已关闭,此问题需要更focused。它目前不接受回答。
**想改善这个问题吗?**更新问题,使其只关注editing this post的一个问题。

2个月前关闭。
Improve this question
找不到正确的答案。如果我们有:

  1. public int findDuplicate = new Duplicate();
  2. Animal animal = new Animal();
    Animal和Cat都有makeSound()方法;
    1.as 我知道Java中的早期绑定发生在编译时,方法调用的绑定取决于引用类型.因此在编译期间,它决定从Animal调用方法。
    然后我们有运行时,它似乎是真实的对象是猫,有一个覆盖的方法,在这一点上,后期投标发生?
    我的问题是,java会先进行静态绑定,然后在运行时再次检查实际对象并重新绑定吗?
    他们说编译绑定比运行时快,但看起来运行时绑定还是会涉及到,即使Cat中没有overriden方法?看起来像是开销
    1.在第二种情况下,Java没有必要检查实际对象?还是会检查
    注解@Override是否也有助于做出这个决定?
    我试着用谷歌搜索,却找不到直接的答案,聊天GPT把我完全搞砸了
8e2ybdfx

8e2ybdfx1#

java会先做静态绑定,然后在运行时再次检查实际对象并重新绑定吗?
是的
但看起来运行时绑定将涉及无论如何即使在Cat中没有overriden方法?看起来像是开销
这有点像在问为什么人们在早上吃早餐,而他们无论如何都会在晚上吃晚餐。
静态绑定发生在编译时,动态绑定发生在运行时。它们是完全不同的过程。例如,编译器执行重载解析(例如在foo(int)foo(String)之间选择),所以JVM不必这样做。如果有的话,在运行时做所有事情都会增加运行时开销。
请参阅JLS的这一部分,分别查看编译时和运行时发生的情况。
此外,静态绑定还有一个额外的好处,那就是你不会意外地调用一个不存在的方法,或者你传递了错误的参数。如果编译器成功绑定,这也意味着您正在调用的方法确实存在,并且参数类型也有效。您可以非常肯定的是,方法调用在运行时将成功,并且您没有犯任何错别字。
在第二种情况下,Java没有必要检查实际对象?还是会检查
无论如何它都会检查。它们都编译为invokevirtual指令,该指令在运行时执行方法选择。如果动态调度的开销是一个性能问题,那么您可能不应该使用Java。
还要注意,如果调用静态方法,则不会有动态分派。JVM将尝试在一个类中找到与指定名称匹配的方法。
注解@Override是否也有助于做出这个决定?
不,@Override只是让编译器检查你是否真的覆盖了超类中的方法,如果没有,就告诉你。参见my answer here

相关问题