gpt4 book ai didi

java - 什么时候初始化成员?

转载 作者:行者123 更新时间:2023-11-29 03:19:27 24 4
gpt4 key购买 nike

考虑以下类:

public class A {
String bar = "A.bar";

A() { foo(); }

public void foo() {
System.out.println("A.foo(): bar = " +
bar);
}
}


public class B extends A {
String bar = "B.bar";

B() { foo(); }

public void foo() {
System.out.println("B.foo(): bar = " +
bar);
}
}

public class C {
public static void main(String[]
args) {
A a = new B();
System.out.println("a.bar = "
+ a.bar);
a.foo();
}
}

现在,打印的第一行是:B.foo(): bar = null。据我了解,成员初始化先于构造函数,但我可以看出这里不是这种情况。

为什么在这个阶段 B#bar 没有初始化?
B#bar 什么时候初始化?

谢谢!

更新:
看完你的答案后,请看一下这个反例:

public class Bazz {

public int a = 42;

public Bazz() {
System.out.println(a);
}

public static void main(String[] args) {
Bazz bazz = new Bazz();
}
}

在这种情况下,a 不是 0。相反,Bazz() 的构造函数打印 42
有什么不同?

最佳答案

让我列举一下步骤:

  • A a = new B();//它看到 B 是 so 调用 A 的构造函数(B.bar 尚未初始化)
  • 在 A 的构造函数中 foo 被调用。因为它已被 B 覆盖,所以 B 的 foo 被调用并显示 null。
  • A 的构造函数完成后,B.bar 被初始化。
  • 然后调用B的构造函数。

注意:即使B中没有调用super(),编译器也会自动添加这条语句。

编辑:编译器如何看待 B 的构造函数:

super();

this.bar = "B.bar";

foo();

更新:您的新结果来 self 之前给出的相同解释:

  • Bazz bazz = new Bazz();//当调用构造函数时,变量 a 被初始化为 42

  • System.out.println(a);//打印 42

实例变量在执行构造函数之前初始化,但在执行 super 构造函数之后。请参阅我上面的编辑。

关于java - 什么时候初始化成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24594988/

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