gpt4 book ai didi

java - 从构造函数调用可覆盖方法的问题

转载 作者:行者123 更新时间:2023-11-29 06:58:12 25 4
gpt4 key购买 nike

如果可以的话请把这句话说清楚

这里,作者说:

Do not call overridable methods from constructors. When creating a subclass object, this could lead to an overridden method being called before the subclass object is fully initialized. Recall that when you construct a subclass object, its constructor first calls one of the direct superclass’s constructors. If the superclass constructor calls an overridable method, the subclass’s version of that method will be called by the superclass constructor—before the subclass constructor’s body has a chance to execute.

我无法理解如何在父类(super class)的构造函数中调用子类版本的可重写方法

XX

最佳答案

首先要区分实例化和初始化。实例化是创建类型实例(为其分配空间并获取对该空间的引用)的过程。初始化是将实例的状态设置为其初始值的过程。

采用以下类型层次结构:

class Foo { 
public Foo() {}
}
class Bar extends Foo {
public Bar() {super();}
}

新实例创建表达式

new Bar();

导致实例化和初始化。实例化首先发生。 Java 创建具体类型 Bar 的实例。

然后需要进行初始化。在继承层次结构中,初始化遵循相同的层次结构,但从上到下。

Object
|
Foo
|
Bar

Object 的构造函数首先运行以初始化定义为 Object 一部分的状态,然后运行 ​​Foo 的构造函数以初始化定义为 Foo 一部分的状态,最后运行 Bar 的构造函数以初始化 Bar 中定义的状态。 您的实例仍然是 Bar 类型。 因此多态性仍然适用。如果您调用一个实例方法并且该方法在层次结构中较低的某处被覆盖,则将调用该实现。

这就是那句话所指的。这很危险。在这里阅读更多内容:

What's wrong with overridable method calls in constructors?

关于java - 从构造函数调用可覆盖方法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30540313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com