今天我的一个 friend 告诉我,如果一条指令是 invoke virtual 它总是动态绑定(bind),而 invoke special 总是静态绑定(bind)?是真的吗?
如果是,那么为什么当带有 final 关键字的方法也调用 virtual 时呢?
请澄清我的疑惑
最佳答案
本质上,是的,你是对的。有趣的部分是 Hotspot 的引入。 Hotspot 本质上是另一个编译器,它知道当前加载了哪些类,更可怕的是它知道何时加载新类,并且可以根据更新的知识即时重新编译。 Hotspot 可能会选择使用 javac 不可用的知识来执行删除动态调度的优化。添加 Hotspot 后,简化了 javac 中的代码。 Sun 剥离了很多逻辑,主要是优化部分。
因此,为了回答您的问题,javac 并没有过多关注方法的 final 关键字。它服从于它的大哥 Hotspot。
Oracle 在此处记录了 Hotspot 执行的一些优化:https://wikis.oracle.com/display/HotSpotInternals/PerformanceTechniques .查看方法部分。
关于java - 调用虚拟总是动态绑定(bind)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24551648/