使用final方法初始化实例变量

gam*_*ver 16 java

来自Sun的文档

通常,您可以使用代码在构造函数中初始化实例变量.
使用构造函数初始化实例变量有两种选择:初始化块和最终方法.

我可以理解初始化块的使用.任何人都可以解释使用最终方法进行var初始化吗?非最终的公共制定者可以完成这项工作.为什么不直接使用它们?

Bal*_*usC 23

优点已在您链接到的相同Sun教程中进行了描述:

不能在子类中重写最终方法.这在接口和继承的课程中讨论.

如果子类可能希望重用初始化方法,这尤其有用.该方法是最终的,因为在实例初始化期间调用非final方法可能会导致问题.Joshua Bloch在Effective Java(第17项设计和继承文档)中更详细地描述了这一点.

非最终方法在初始化中存在危险的原因是因为超类的实例初始化在初始化子类之前执行.因此,如果非最终方法在子类中被覆盖并且在超类的初始化期间执行,则它可能正在访问子类的未初始化字段,从而给出错误的结果.

一般规则是(引用Effective Java):构造函数不能直接或间接调用可覆盖的方法.

  • @BalusC:我读过那个,但是覆盖初始化方法的子类如何影响父类? (2认同)