Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建类层次结构时,组成层次结构的类的构造函数的调用顺序是什么?_Java_Oop - Fatal编程技术网

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

Java 创建类层次结构时,组成层次结构的类的构造函数的调用顺序是什么?,java,oop,Java,Oop,我正在研究java中的多级继承,并坚持这个概念:在类层次结构中,构造函数是按派生顺序调用的,从超类到子类。 我试着在谷歌上寻找合适的解释,但没有令人满意的结果 请举例说明,这真的很有帮助我想当你把它明确化时,这是很明显的: class A { A() { System.out.println("3"); } } class B extends A { B(String foo) { super(); System.out.println(

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


请举例说明,这真的很有帮助

我想当你把它明确化时,这是很明显的:

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(…)
始终是第一条指令。尽管发生了这样的事情:

  • newc(“foo”)
    将调用
    C
    构造函数
  • C
    构造函数中的第一行将调用超级构造函数(
    B
  • B
    调用构造函数
  • B
    构造函数中的第一行将调用超级构造函数(
    A
  • 调用构造函数(打印
    3
  • A
    构造函数的所有行都完成时,它将把控制权返回到
    B
    构造函数
  • B
    构造函数将在调用
    super
    后执行所有行(打印
    2
    +
    foo
  • 然后它将控制权返回到
    C
    构造函数
  • C
    构造函数将在调用
    super
    后执行所有行(打印
    1
  • 当您不创建显式构造函数时,此代码仍将以完全相同的顺序运行


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

    这是您可以自己轻松测试的。据猜测,我认为它是从
    对象开始向下移动的,但我没有尝试。
    我尝试在谷歌上寻找合适的解释,但没有令人满意的内容。
    。你可能会找到有用的阅读资料