我已经知道应该创建这样的对象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)
第一个电话:
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()未定义.必须显式调用另一个构造函数
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)
这解释了第二和第三输出线.
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |