gpt4 book ai didi

java - 什么是 Java 中的对象字段初始化和构造函数顺序

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:55:40 25 4
gpt4 key购买 nike

我今天早些时候在代码中完成了以下场景(我承认这有点奇怪,我已经重构了)。当我运行单元测试时,我发现在运行父类(super class)构造函数时未设置字段初始化。我意识到我不完全理解构造函数/字段初始化的顺序,所以我发帖希望有人向我解释这些发生的顺序。

class Foo extends FooBase {
String foo = "foobar";

@Override
public void setup() {
if (foo == null) {
throw new RuntimeException("foo is null");
}
super.setup();
}
}

class FooBase {
public FooBase() {
setup();
}

public void setup() {

}
}

@Test
public void testFoo() {
new Foo();
}

来自 JUnit 的简短回溯如下,我想我希望 $Foo. 设置 foo。

$Foo.setup
$FooBase.<init>
$Foo.<init>
.testFoo

最佳答案

是的,在 Java 中(与 C# 不同,例如)字段初始值设定项在父类(super class)构造函数之后被调用。这意味着来自构造函数的任何重写方法调用都将在字段初始值设定项执行之前被调用。

顺序是:

  • 初始化父类(super class)(递归调用这些步骤)
  • 执行字段初始化
  • 执行构造函数体(在任何构造函数链接之后,这已经在步骤 1 中发生)

基本上,在构造函数中调用非 final方法是个坏主意。如果您打算这样做,请非常清楚地记录下来,以便覆盖该方法的任何人都知道该方法将在执行字段初始值设定项(或构造函数主体)之前被调用。

参见 JLS section 12.5了解更多详情。

关于java - 什么是 Java 中的对象字段初始化和构造函数顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20577430/

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