Java JVM';s的虚拟函数查找是否有任何最终优化?
假设Java JVM';s的虚拟函数查找是否有任何最终优化?,java,jvm,Java,Jvm,假设obj的类型为metalcrollbutton(来自JavaSwing)。例如,程序可以在obj上调用getButtonWidth()。尽管必须在构造时指定方向,obj.getDirection()将从BasicArrowButton调用getDirection()MetalScrollButton从JComponent和组件继承了很多内容 显然,metalcrollbutton继承了Object中的所有标准内容,比如getClass()函数,它被合理地标记为final 因此,obj.get
obj
的类型为metalcrollbutton
(来自JavaSwing)。例如,程序可以在obj
上调用getButtonWidth()
。尽管必须在构造时指定方向,obj.getDirection()
将从BasicArrowButton
调用getDirection()
MetalScrollButton
从JComponent
和组件继承了很多内容
显然,metalcrollbutton
继承了Object
中的所有标准内容,比如getClass()
函数,它被合理地标记为final
因此,obj.getClass()
会导致虚拟函数查找从metalcrollbutton
开始,一直到Object
(当然,从人的角度来看,这是即时的),还是JVM知道直接到Object
更一般地说,如果所需的函数在继承层次结构的某个级别是final,JVM是否有任何关于这一事实的指示,以及在查找过程中跳过无法覆盖final函数的子类的能力?这是特定于供应商的。JVM当然知道哪些函数是final,虽然它更关心函数是否被实际重写,而不是是否可以被重写。是的,HotSpot JVM进行虚拟调用优化,而不仅仅是针对final
方法。见@AlonsodelArte是的。这允许供应商选择他们认为最合适的方式。这是故意的。唯一可以确保在所有供应商中保持一致的是Java语言规范所说的内容。它非常精确。getClass()
无论如何都很特别。即使没有方法查找(也存在)的优化,它也会被视为一个特殊的、不变的操作(只是从对象读取类引用),而不是方法调用。这是特定于供应商的。JVM当然知道哪些函数是最终的,虽然它更关心函数是否被实际重写,而不是是否可以被重写。是的,HotSpot JVM进行虚拟调用优化,而不仅仅是针对final
方法。见@AlonsodelArte是的。这允许供应商选择他们认为最合适的方式。这是故意的。唯一可以确保在所有供应商中保持一致的是Java语言规范所说的内容。它非常精确。getClass()
无论如何都很特别。即使没有方法查找(也存在)的优化,它也会被视为一个特殊的、不变的操作(只是从对象读取类引用),而不是方法调用。