创建类层次结构时,构成层次结构的类的构造函数按什么顺序调用?

时间:2021-03-06 19:46:40

标签: java oop

我正在研究 java 中的多级继承并坚持这个概念:在类层次结构中,构造函数按派生顺序调用,从超类到子类。 我试着在谷歌上寻找正确的解释,但没有令人满意的。

请举例说明,很有帮助

1 个答案:

答案 0 :(得分:-1)

我想当你明确表示时很明显:

class A {
  A() {
    System.out.println("3");
  }
}

class B extends A {
  B(String foo) {
    super();
    System.out.println("2" + foo);
  }
}

class C extends B {
  C(String foo) {
    super(foo);
    System.out.println("1");
  }
}

在使用这些显式构造函数调用时,您可以看到 super(...)总是第一条指令。虽然这是发生的事情:

  1. new C("foo"); 将调用 C 构造函数
  2. C 构造函数中的第一行将调用超级构造函数 (B)
  3. B 构造函数被调用
  4. B 构造函数中的第一行将调用超级构造函数 (A)
  5. A 构造函数被调用(打印 3
  6. A 构造函数的所有行都完成后,它会将控制权返回给 B 构造函数
  7. B 构造函数将执行 super 调用后的所有行(打印 2 + foo
  8. 然后它将控制权返回给 C 构造函数
  9. C 构造函数将执行 super 调用后的所有行(打印 1

当您不创建显式构造函数时,此代码仍将以完全相同的顺序运行。

与从方法内部调用方法,或调用超级方法基本相同。唯一的区别是,您必须在执行任何其他代码之前调用超级构造函数。