gpt4 book ai didi

java - 请用java解释一下这个行为

转载 作者:行者123 更新时间:2023-12-02 04:10:43 26 4
gpt4 key购买 nike

class abc extends TestStart{
static{
System.out.println("c");
}
{
System.out.println("f");
}
public abc(){
System.out.println("d");
}
}

public class TestStart {
static {
System.out.println("A");
}
{
System.out.println("z");
}
public TestStart(){
System.out.println("b");
}

public static void main(String[] args) {

TestStart x = new abc();
TestStart y = new TestStart();
}
}
<小时/>

输出------------>ACz乙Fdz

我认为这个的输出行为 ---->>>>>> TestStart x = new abc(); --------应该是:-

  1. 两个类的第一个静态 block 都将运行
  2. 然后,由于 new abc(),子类的 init block 将被调用。但是这里父类的 init 被调用
  3. 然后从 new abc() 调用 super(),从而调用父类构造函数。
  4. 在父类构造函数之前,父类的init block 将执行。
  5. 然后 parnet 类的构造函数将执行
  6. 然后子类的构造函数将执行。

我应该得到以下输出:ACFz乙dz

此行为很大程度上源于父类和子类中没有 init block 的情况。请解释我提到的输出。

最佳答案

你得到:A c z b f d z b 而您期望的是:A c f z b d z b

所以,您是说您期望 fz b 之前发生。

所以,您实质上所说的是您所期望的:

  • 最底层派生类的实例初始值设定项 (f)

之前调用
  • 基类的实例初始值设定项 (z) 和
  • 基类的构造函数 (b)。

嗯,事情根本不是这样发生的。基类的所有实例初始化必须在派生类的实例初始化开始之前完成,否则派生类将能够访问基类的未初始化成员。

所有静态初始化内容(Ac)都是在问题中抛出的红鲱鱼来迷惑我们。

关于java - 请用java解释一下这个行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33828597/

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