为什么在类构造函数上调用的方法应该是最终的?

Par*_*pan 6 java final

我是Java新手,我试图理解Oracle网站教程中的以下内容:http://docs.oracle.com/javase/tutorial/java/IandI/final.html

从构造函数调用的方法通常应该声明为final.如果构造函数调用非final方法,则子类可能会以令人惊讶或不良结果重新定义该方法.

我尝试多次阅读它,试图理解如何通过子类重新定义从构造函数调用的方法.我是否应该假设构造函数调用的方法是在构造函数的类中声明的方法?如果从构造函数中调用方法,为什么要将方法声明为final?(与嵌套类或其他方法中的相反?)我无法绕过那个语句.一个例子就是很棒.

Sto*_*ica 6

这是有效的代码(编译):

class Person {
    Person() {
        init();
    }

    void init() {
        // do stuff
    }
}

class Employee extends Person {
    Employee() {
        super();
    }

    void init() {
        // do something else
    }
}
Run Code Online (Sandbox Code Playgroud)

它非常可疑.因为Person.init可能会对班级的完整性做一些至关重要的事情,并且也无法保证Employee.init会这样做.

限制Person.initprivate不够好.Employee.init仍然有效,但它会影响 Person.init,这将是非常误导.最好制作Person.init final,禁止创作Employee.init.