Java 使用“最终”方法

Java 使用“最终”方法,java,keyword,final,Java,Keyword,Final,我知道,final关键字在方法上的一个用途是强制子类使用相同的方法实现。但是,通过允许编译器将对该方法的调用转换为内联java代码来提高效率意味着什么呢?我刚读了这篇文章,但不太明白其中的意思 在这种程度上,我不理解内联Java代码的含义。如何执行对final方法的调用?在编译调用final方法的代码时,Java会通知或执行什么特殊的操作吗?如果使用final,字节码的效率不会明显提高或降低,因为Java字节码编译器通常很少进行优化。效率奖金(如果有的话)将出现在JIT编译器生成的本机代码中 理

我知道,
final
关键字在方法上的一个用途是强制子类使用相同的方法实现。但是,通过允许编译器将对该方法的调用转换为内联java代码来提高效率意味着什么呢?我刚读了这篇文章,但不太明白其中的意思


在这种程度上,我不理解内联Java代码的含义。如何执行对
final
方法的调用?在编译调用
final
方法的代码时,Java会通知或执行什么特殊的操作吗?

如果使用final,字节码的效率不会明显提高或降低,因为Java字节码编译器通常很少进行优化。效率奖金(如果有的话)将出现在JIT编译器生成的本机代码中

理论上,使用final可以向JIT编译器提供一个提示,帮助它进行优化。实际上,最近的HotSpot JIT编译器可以通过忽略提示来做得更好。例如,现代JIT编译器通常会执行全局分析,以确定给定的方法调用是否是在应用程序当前加载的类的上下文中对叶方法的调用。此分析比您的最终提示更准确,运行时甚至可以检测何时加载了使分析无效的新类。。。并对受影响的代码重新执行分析和本机代码生成

所以,最佳实践是使用final(广义地说)来表达您的设计意图,并实现您需要的其他语义效果。(例如,使用final修饰符可以在实现线程安全的不可变类型方面发挥重要作用。)如果使用final作为优化提示,将不会取得太大的效果,并且会使代码更难修改和扩展


font:

当您想知道Java编译器如何处理不同的构造时,一个很好的方法是使用
javap
反汇编类文件

最终的方法可能会提供优化的机会,因为将运行的代码在编译时是已知的。否则,必须在运行时执行查找,以确定要运行的版本(原始版本或重写版本)


这是理论。。。实际上,现有的Java编译器不会进行非常积极的优化。

正如上面Leonardo Pugliese指出的,虽然Java到字节码编译器不会进行太多优化,但现代JVM中的字节码到机器码编译器会积极地进行优化,包括这个特性。我同意,但不会说JIT的分析比程序员的最终“提示”更准确,因为声明最终的东西不仅仅是提示,它是强制性的,因此尽可能准确。但在大多数情况下,优化器将检测最终行为,并以与最终声明相同的方式处理它。