为什么这些构造函数按此顺序运行?

3 java constructor object

我已经知道应该创建这样的对象Class_name Object_name=new Classname().在我的程序中,我创建了一个名为的超类sup和一个名为的派生类der.在我的子类构造函数中,我创建了一个这样的对象sup obc = new der();.没有任何错误,它编译并给出如下输出:

In Superclass with object passed as reference
In Superclass with no constructor
In derived class with no constructor
Run Code Online (Sandbox Code Playgroud)

我不明白我是如何按此顺序获得输出的.为什么会这样?这是完整的代码:

class sup {

  private int a, b, c;

  sup(sup ob) {
    System.out.println("In Superclass with object passed as reference");
    a = ob.a + 9;
    b = ob.b + 9;
  }

  sup(int a, int b) {
    this.a = a;
    this.b = b;
  }

  sup() {
    System.out.println("In Superclass with no constructor");
  }

}

class der extends sup {

  int d;

  der(der ob) {
    super(ob);
    sup obc = new der();
  }

  der() {
    System.out.println("In derived class with no constructor");
  }

  der(int a, int b, int c) {
    super(a, b);
    d = c;
  }
}

public class Test {

  public static void main(String args[]) {
    der ob1 = new der(3, 4, 5);
    der ob2 = new der(ob1);
  }
}
Run Code Online (Sandbox Code Playgroud)

dur*_*597 9

第一个电话:

der ob1 = new der(3, 4, 5);
Run Code Online (Sandbox Code Playgroud)

什么都不打印,因为它首先调用:

der(int a, int b, int c) {
    super(a, b);
Run Code Online (Sandbox Code Playgroud)

哪个电话:

sup(int a, int b) {
    this.a = a;
    this.b = b;
}
Run Code Online (Sandbox Code Playgroud)

哪个没有System.out.println陈述.没有其他构造函数被调用,因为您从未显式调用它们.sup()因为你已经调用了隐式构造函数,所以不会调用它super(a, b).


第二个电话:

der ob2 = new der(ob1);
Run Code Online (Sandbox Code Playgroud)

调用此构造函数:

der(der ob) {
    super(ob);
    sup obc = new der();
}
Run Code Online (Sandbox Code Playgroud)

发生的第一件事是这里的超级构造函数被调用:

sup(sup ob) {
    System.out.println("In Superclass with object passed as reference");
Run Code Online (Sandbox Code Playgroud)

这是第一件被印刷的东西.然后,第二行:

sup obc = new der();
Run Code Online (Sandbox Code Playgroud)

被调用,调用此构造函数:

der() {
    System.out.println("In derived class with no constructor");
}
Run Code Online (Sandbox Code Playgroud)

然而,有一个隐式调用super();这里总是被调用在子类中,即使你不写它.所以我们再打电话:

sup() {
    System.out.println("In Superclass with no constructor");
}
Run Code Online (Sandbox Code Playgroud)

这被打印出来,最后der的构造函数可以完成.

需要注意的是,如果你删除无参数的构造函数sup,der将不再与错误编译:

隐式超级构造函数ArrayListTest.sup()未定义.必须显式调用另一个构造函数


Jac*_*ack 6

der(der ob) {
  super(ob);
  sup obc = new der();
}
Run Code Online (Sandbox Code Playgroud)

这样做的第一件事是调用超类构造函数sup(sup obj)(打印第一个输出行),然后代码(没有任何理由)分配一个new der().

但是在Java中,超类默认构造函数在子类构造函数之前被隐式调用,实际上der()构造函数实现可以看作

der()
{
  super();
  System.out.println("In derived class with no constructor");
}
Run Code Online (Sandbox Code Playgroud)

这解释了第二和第三输出线.