我知道final
方法中关键字的用途之一是强制子类使用相同的方法实现。但是,通过允许编译器将对方法的调用转换为内联 java 代码来提高效率是什么意思呢?我刚读了这个,但不太明白这个想法。
在这个程度上,我不明白内联 Java 代码的含义。如何final
执行对方法的调用?在编译调用final
方法的代码期间,Java 是否会通知或执行任何特殊操作?
如果您使用 final,字节码的效率并不会显着提高或降低,因为 Java 字节码编译器通常在优化方式上做的很少。效率奖励(如果有的话)将在 JIT 编译器生成的本机代码中。
理论上,使用 final 为 JIT 编译器提供了一个提示,可以帮助它进行优化。在实践中,最近的 HotSpot JIT 编译器可以通过忽略您的提示来做得更好。例如,现代 JIT 编译器通常会执行全局分析,以确定给定的方法调用是否是对应用程序当前加载的类的上下文中的叶方法的调用。这种分析比您的最终提示更准确,运行时甚至可以检测到何时加载了使分析无效的新类......并为受影响的代码重做分析和本机代码生成。
所以最佳实践是使用 final 来(广义地)表达你的设计意图,并实现你需要的其他语义效果。(例如,使用 final 修饰符可以在实现线程安全的不可变类型中发挥重要作用。)如果您使用 final 作为优化提示,您将不会取得太多成果,并且您将使您的代码更难修改和扩展。
字体:链接
当您想知道 Java 编译器如何处理不同的构造时,一种很好的找出方法是使用javap
反汇编类文件。
最终方法可能会提供优化的机会,因为将运行的代码在编译时是已知的。否则,必须在运行时执行查找,以确定要运行的版本(原始版本或覆盖版本)。
这就是理论……在实践中,现有的 Java 编译器并没有进行非常积极的优化。