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

Java 为什么这些构造函数按这种顺序运行?,java,object,constructor,Java,Object,Constructor,我已经了解了对象应该像这样创建Class\u name object\u name=new Classname()。在我的程序中,我创建了一个名为sup的超类和一个名为der的派生类。在我的子类构造函数中,我创建了这样一个对象sup obc=new der()。在没有任何错误的情况下,它编译并给出如下输出: 对象作为引用传递的超类中的 在没有构造函数的超类中 在没有构造函数的派生类中 我不明白我是如何得到这个顺序的输出的。为什么会发生这种情况?以下是完整的代码: class sup {

我已经了解了对象应该像这样创建
Class\u name object\u name=new Classname()
。在我的程序中,我创建了一个名为
sup
的超类和一个名为
der
的派生类。在我的子类构造函数中,我创建了这样一个对象
sup obc=new der()。在没有任何错误的情况下,它编译并给出如下输出:

对象作为引用传递的超类中的

在没有构造函数的超类中
在没有构造函数的派生类中
我不明白我是如何得到这个顺序的输出的。为什么会发生这种情况?以下是完整的代码:

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);
  }
}
这样做的第一件事是调用超类构造函数
sup(sup obj)
(它打印第一个输出行),然后代码(没有任何原因)分配一个
新的der()

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

der()
{
  super();
  System.out.println("In derived class with no constructor");
}
这解释了第二个和第三个输出行。

第一个调用:

der ob1 = new der(3, 4, 5);
不打印任何内容,因为它首先调用:

der(int a, int b, int c) {
    super(a, b);
这要求:

sup(int a, int b) {
    this.a = a;
    this.b = b;
}
它没有
System.out.println
语句。没有调用任何其他构造函数,因为从不显式调用它们。隐式的
sup()
构造函数没有被调用,因为您已经调用了
super(a,b)


第二个电话:

der ob2 = new der(ob1);
调用此构造函数:

der(der ob) {
    super(ob);
    sup obc = new der();
}
der() {
    System.out.println("In derived class with no constructor");
}
发生的第一件事是调用这里的超级构造函数:

sup(sup ob) {
    System.out.println("In Superclass with object passed as reference");
这是打印的第一件事。然后,第二行:

sup obc = new der();
调用,它调用此构造函数:

der(der ob) {
    super(ob);
    sup obc = new der();
}
der() {
    System.out.println("In derived class with no constructor");
}
但是,有一个隐式调用
super()总是在子类中调用,即使您没有编写它。因此,我们称之为:

sup() {
    System.out.println("In Superclass with no constructor");
}
这将被打印出来,最后,
der
的构造函数可以完成

请注意,如果删除
sup
的无参数构造函数
der
将不再编译,并出现以下错误:

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


第一个
der
对象调用没有输出的
super(a,b)
构造函数。第二个调用
sup(sup ob)
,它给出第一行输出,然后它还调用
new der()
,当子类的默认构造函数被调用时,它的超类的默认构造函数也被调用。这就是第二条线的来源。然后
new Der()
输出第三行。

请确保遵守Java命名约定,尤其是在这些格式化的第一个程序中。在Java中,类名称使用
PascalCase
,变量使用
camelCase
。此外,请在发布之前格式化您的代码。由于我是java新手,我将很快学习java命名约定@BoristheSpider@Ashokkumar不要在将来学习,你应该试着现在编辑并学习。@karthik是的。我已经把代码格式化了一点。从现在起,我将使用正确的命名约定。@Ashokkumar不要手工格式化代码!那是一项徒劳的任务。让IDE为您自动格式化。