今天,我的一个 friend 告诉我,如果一条指令是虚拟调用的,它总是动态绑定的,而特殊调用总是静态地绑定?是真的吗

如果是,那为什么带有final关键字的方法也调用虚拟方法呢?

请澄清我有这个疑问

最佳答案

本质上,是的,您是正确的。有趣的部分是Hotspot的引入。 Hotspot本质上是另一种编译器,它知道当前正在加载哪些类,甚至更令人恐惧的是,它知道何时加载新类,并且可以即时使用更新后的知识进行重新编译。热点可能会选择执行优化,以使用javac所不具备的知识来删除动态调度。添加Hotspot后,javac中的代码得到了简化。 Sun剥离了很多逻辑,其中大部分是优化部分。

因此,要回答您的问题,javac不会过多注意方法的最终关键字。它顺应其较大的兄弟Hotspot。

Oracle在此处记录了Hotspot执行的一些优化:https://wikis.oracle.com/display/HotSpotInternals/PerformanceTechniques。在该部分下面查看方法。

09-25 20:15