我是Java新手,我试图理解Oracle网站教程中的以下内容:http://docs.oracle.com/javase/tutorial/java/IandI/final.html
从构造函数调用的方法通常应该声明为final。如果构造函数调用非final方法,则子类可能会以令人惊讶或不合需要的结果重新定义该方法。
我尝试多次阅读它,试图理解如何通过子类重新定义从构造函数调用的方法。我是否应该假设构造函数调用的方法是在构造函数的类中声明的方法?如果从构造函数中调用方法,为什么要将方法声明为final? (与嵌套类或其他方法中的相反?)我无法绕过那个语句。一个例子就是很棒。
答案 0 :(得分:6)
这是有效的代码(编译):
class Person {
Person() {
init();
}
void init() {
// do stuff
}
}
class Employee extends Person {
Employee() {
super();
}
void init() {
// do something else
}
}
它非常可疑。因为Person.init
可能会对课程的完整性起到至关重要的作用,并且Employee.init
也无法保证这样做。
将Person.init
限制为private
还不够好。 Employee.init
仍然有效,但 shadow Person.init
,这将是非常误导。最好制作Person.init
final
,禁止创建Employee.init
。