java - 为什么从类构造函数调用的方法应该是最终的?

标签 java final

<分区>

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

Methods called from constructors should generally be declared final. If a constructor calls a non-final method, a subclass may redefine that method with surprising or undesirable results.

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

最佳答案

这是有效代码(编译):

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.init final,这样就禁止创建 Employee.init

关于java - 为什么从类构造函数调用的方法应该是最终的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27661992/

相关文章:

JavaFX DatePicker 返回 null

java - 参数的非法修饰符

java - 最终变量是否在每个实例的基础上占用内存?

java - 向 Spring OAuth2 Auth Server 添加多个客户端

java - 需要使用 Jsoup 在网页上自动登录的帮助

java - 使用不同的构造函数参数并使用 Autowiring 创建同一类的 2 个 bean

java - Eclipse - 默认情况下使重写方法和类最终

java - 是否可以在 catch 中重新分配最终变量,即使分配是 try 中的最后一个操作?

java - 为什么接口(interface)中的所有字段都是隐式静态和最终的?

java - 如何在 Heroku 上与 Node.js 应用程序并行运行 Java 11 .jar 文件?