我知道如果一个类被声明为final,那么它的方法实际上就不能被覆盖,因为首先需要一个子类来覆盖它们。话虽这么说,我想知道这是否仍然与在该类的每个方法前输入“final”完全相同。
我问这个问题的原因是,将方法设置为 final 可能会导致其中一些运行得更快;我想知道的是,对于已声明为 final 的类中的所有方法,这种加速优势是否会自动平等地存在,或者您是否必须明确地使这些方法成为 final 才能获得这种优势。
谢谢!
最佳答案
您不能扩展最终类,因此您不能重写它的方法。谈论这些方法是不是 final 真的没有意义。
final 方法理论上的速度提升是因为编译器可以在有意义的情况下内联函数。很难准确预测编译器何时执行此操作,而且大多数情况下您不会注意到差异。它没有记录(或者据我所知),但我想启发式将基于函数是否短以及是否在循环中使用。在那种情况下,函数包装器的开销与其包含的代码相比将变得非常重要。
注意:使用 arguments
对象的函数无法进行内联。
在实践中,您通常不会注意到速度差异。但是,如果您可以构造一个可以对其进行测量的案例,则可以通过将类设为 final 而不是方法来轻松地进行测试。
编辑: FWIW,我试过了,但无法衡量在方法上使用 final
和不使用它之间的区别。在类里面使用 final
也是一样的。 This SO answer
得出相同的结论。
关于actionscript-3 - 将类声明为 final 时,每个方法是否也自动声明为 final?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15144185/