Java 中子 类 中构造函数的行为

Behavior of costructors in sub classes in Java

假设我有以下代码:

class A {
  Greating g = new Greating();
  public A(){system.out.print("Creating class A");}
}

class B extends A{
  public B(){system.out.print("Creating class B");}
}

class Greating{
  public Greating(){system.out.print("Hi");}
}

我尝试执行时的输出是什么

public static void main(String[] args) {
  new B();
}

我以为它会先调用 B 的构造函数,B 的构造函数会调用 A 的构造函数,但我不知道会显示 "creating A" 或 "Hi" 消息中的哪一个第一的。在 class 上调用的第一件事应该是它的构造函数,但是当我执行程序时,我注意到 "Hi" 在 "Creating A" 之后显示。为什么?

子类总是在构造函数的最开始调用它超类的构造函数。因为A的构造函数没有任何参数,你不需要显式调用它,但编译器基本上会在B的构造函数的最开头添加super()。

输出将如下所示:

Hi
Creating class A
Creating class B

因为首先会调用构造函数Greating()初始化属性 g的A然后执行构造函数A() 然后执行构造函数 B()