3

我知道如果一个类被声明为final,那么它的方法实际上是无法被覆盖的,因为首先需要一个子类来覆盖它们。话虽如此,我想知道这是否仍然与在该类中的每个方法前面输入“final”完全一样。

我问这个的原因是让方法最终可能会导致它们中的一些运行得更快;我想知道的是,对于已声明为 final 的类中的所有方法,这种加速优势是否自动平等地存在,或者您是否必须显式地将方法设为 final 才能获得这种优势。

谢谢!

4

1 回答 1

3

你不能扩展最终类,所以你不能覆盖它的方法。谈论方法是否是最终的并没有真正的意义。

final 方法的理论速度提高是因为编译器可以在有意义的情况下内联函数。很难准确预测编译器何时会这样做,而且大多数情况下您不会注意到差异。它没有记录(或据我所知),但我想启发式将基于函数的简短性以及是否在循环中使用。在这种情况下,函数包装器的开销与其包含的代码相比将变得非常重要。

arguments注意:对于使用该对象的函数,内联是不可能的。

在实践中,您几乎不会注意到速度差异。但是,如果您可以构建一个可以测量的案例,您可以通过将类设为 final 而不是方法来轻松进行测试。

编辑: FWIW,我试过了,无法衡量使用final方法和不使用方法之间的区别。final在课堂上使用也是一样的。这个 SO 答案 得出了相同的结论。

于 2013-03-01T00:32:38.430 回答