为啥从类构造函数调用的方法应该是最终的? [复制]

Posted

技术标签:

【中文标题】为啥从类构造函数调用的方法应该是最终的? [复制]【英文标题】:Why should methods called from a class constructor be final? [duplicate]为什么从类构造函数调用的方法应该是最终的? [复制] 【发布时间】:2014-12-26 21:06:33 【问题描述】:

我是一名 Java 新手,我试图从 Oracle 网站上的教程中理解以下行:https://docs.oracle.com/javase/tutorial/java/IandI/final.html

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

我尝试多次阅读它,试图理解从构造函数调用的方法如何被子类重新定义。我应该假设构造函数调用的方法是在构造函数的类中声明的方法吗?如果一个方法是在构造函数中调用的,为什么还要声明它为 final 呢? (而不是在嵌套类中或在另一个方法中?)我无法理解该声明。举个例子就好了。

【问题讨论】:

【参考方案1】:

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

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 仍然有效,但它会影响 Person.init,这将非常容易产生误导。最好设为Person.initfinal,这样就禁止创建Employee.init

【讨论】:

以上是关于为啥从类构造函数调用的方法应该是最终的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥在malloc中不调用构造函数? [复制]

如何在主方法中从类中调用构造函数

为啥复制构造函数应该在 C++ 中通过引用来接受它的参数?

当我们将对象作为参数传递给方法时,为啥会调用复制构造函数?

为啥我们需要复制构造函数以及何时应该在 java 中使用复制构造函数

为啥隐式复制构造函数调用基类复制构造函数而定义的复制构造函数不调用?