我了解到应该像这样创建对象 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/