java - 为什么这些构造函数按这个顺序运行?

标签 java object constructor

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

In Superclass with object passed as reference
In Superclass with no constructor
In derived class with no constructor

我不明白我是如何按照这个顺序得到输出的。为什么会这样?完整代码如下:

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);
  }
}

最佳答案

第一次调用:

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();
}

首先发生的事情是这里的 super 构造函数被调用:

sup(sup ob) {
    System.out.println("In Superclass with object passed as reference");

这是打印的第一件事。然后,第二行:

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 将不再编译错误:

Implicit super constructor ArrayListTest.sup() is undefined. Must explicitly invoke another constructor

关于java - 为什么这些构造函数按这个顺序运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31682457/

相关文章:

java - 处理 HTTP 状态码的通用机制

javascript - JSON 数组响应中的总和值

javascript - 按两个键对对象数组进行排序和分组,并使用新键创建分组项数组

c# - 使用析构函数分离事件

delphi - 如何在构造函数中调用需要设置控件“Parent”的函数?

java - 以有效的方式查找 PowerSet 的特定子集

java - 如何创建正则表达式匹配流?

java - 接受多种http方法?

c++ - 在类中声明 vector 大小

c++ - 使用原始数据类型的默认构造函数进行默认初始化