最终类中的非最终方法
我的问题很简单:
编译器是否将最终类中的所有方法本身视为最终方法?将关键字添加到最终类中的方法是否有任何影响?final
我明白最终方法有更好的机会内联,这就是我问的原因。
提前致谢。
我的问题很简单:
编译器是否将最终类中的所有方法本身视为最终方法?将关键字添加到最终类中的方法是否有任何影响?final
我明白最终方法有更好的机会内联,这就是我问的原因。
提前致谢。
你是对的,最终类中的所有方法都是隐式最终的。
“请注意,您还可以声明整个班级的决赛。不能对声明为 final 的类进行子类化。这特别有用,例如,在创建不可变类(如 String 类)时。
最终类中的所有方法都是隐式最终的。
您可能也对此感兴趣:Java 最终关键字的性能提示
编译器是否将最终类中的所有方法本身视为最终方法?
实际上,是的,确实如此。类中的方法不能被重写。向方法添加(或删除)关键字与此规则没有区别。final
final
将 final 关键字添加到最终类中的方法是否有任何影响?
在实践中,它的影响微乎其微。它对覆盖规则没有影响(见上文),对内联也没有影响(见下文)。
可以在运行时判断方法是否使用关键字声明...使用反射来查看方法的标志。因此,它确实有一些效果,尽管这种效果与99.99%的程序无关。final
我明白最终方法有更好的机会内联,这就是我问的原因。
这种理解是不正确的。现代 JVM 中的 JIT 编译器跟踪应用程序加载的类中未重写哪些方法。它使用此信息和静态类型来确定特定调用是否需要虚拟类分派。如果不是,则内联是可能的,并且将根据方法主体的大小使用。实际上,JIT 编译器忽略了 的存在/不存在,并使用更准确的方法来检测允许内联方法的方法调用。final
(事实上,它比这更复杂。应用程序可以动态加载子类,从而导致 JIT 编译器的方法重写分析变得不正确。如果发生这种情况,JVM 需要使任何受影响的编译方法失效,并导致它们被重新编译。
底线是:
在类中添加方法没有任何性能优势。final
final
非类中的方法可能有性能优势,但前提是您使用的是旧的 Sun JVM,或者其他一些具有质量较差的 JIT 编译器的 Java /Java 平台。final
final
如果您关心性能,最好使用具有良好JIT编译器的最新/高性能Java平台,而不是用将来可能导致您出现问题的关键字污染您的代码库。final
你在评论中写道:
@RussellZahniser 我在很多地方读书的方式都不一样。
互联网上充斥着旧信息,其中大部分已经过时了...或者从一开始就不正确。