Java 输出背后的逻辑

Java 输出背后的逻辑,java,Java,有人能解释为什么这个代码会打印出来吗; “埃斯巴!博斯科普!巴南!基尔希!加拉!乔纳戈尔德!” 而不是印刷 “Essbar!Banane!Kirsche!Boskop!Gala!Jonagold!”?首先打印静态变量,因为静态变量是在应用程序启动时创建的,而不是在代码实际开始运行时创建的 埃斯巴!博斯科普 内联初始化字段接下来被初始化,因为构造函数可能想要使用它们 埃斯巴!博斯科普!巴南!Kirsche 在构造函数初始值中,吨是最后打印的。每个construcor首先隐式地调用super,然后调

有人能解释为什么这个代码会打印出来吗; “埃斯巴!博斯科普!巴南!基尔希!加拉!乔纳戈尔德!”

而不是印刷
“Essbar!Banane!Kirsche!Boskop!Gala!Jonagold!”?

首先打印静态变量,因为静态变量是在应用程序启动时创建的,而不是在代码实际开始运行时创建的

埃斯巴!博斯科普

内联初始化字段接下来被初始化,因为构造函数可能想要使用它们

埃斯巴!博斯科普!巴南!Kirsche

在构造函数初始值中,吨是最后打印的。每个construcor首先隐式地调用super,然后调用自己的代码。这就是为什么“Gala!”在“Jonagold”之前

埃斯巴!博斯科普!巴南!Kirsche!联欢会!乔纳戈尔德

因此,总结一下。首先打印静态变量。这些与您的主要方法完全无关。 然后创建
Apfel
构造函数。在此运行之前,将调用
Frucht
构造函数。由于
Frucht
构造函数可能需要
Frucht.mp2
,因此会创建它并打印“Banane!”
Frucht
s自己的构造函数通过打印“Kirche!”完成。现在是使用Apfel的时候了。由于它可能需要
Apfel.mp2
创建它并因此打印“Gala!”。最后,
Apfel
构造函数通过打印“Jonagold”完成


至于为什么“Essbar!”印在“Boskop!”之前。这一切都发生在链接阶段而不是运行阶段。类
Essbar
需要对类
Frucht
可见,因为它扩展了类
Frucht
,而
Frucht
需要在扩展类
Apfel
时对其可见。在初始化所有静态变量之前,类对其他类不可见。

编辑了您的代码格式,因为使用原始格式很难理解代码流。感谢您澄清:)
public class three {
  public static void main(String[] args) {
    Apfel a = new Apfel();
  }
}

class Apfel extends Frucht {
  static Print mp = new Print("Boskop!");
  Print mp2 = new Print("Gala!");

  public Apfel() {
    System.out.print("Jonagold!");
  }
}

class Frucht extends Essbar {
  Print mp2 = new Print("Banane!");

  public Frucht() {
    System.out.print("Kirsche!");
  }
}

class Essbar {
  static Print mp = new Print("Essbar!");
}

class Print {
  public Print(String msg) {
    System.out.print(msg);
  }
}