我想知道为什么以下代码:
public class Vertebrate {
public Vertebrate() {
System.out.print("Vertebrate ");
}
public static void main(String[] args) {
Mammal rabbit = new Mammal();
System.out.println("Rabbit");
}
}
class Mammal extends Vertebrate {
public Mammal() {
System.out.print("Mammal ");
}
}
生成输出:Vertebrate Mammal Rabbit
。
我被要求详细解释,但我不明白为什么输出就像它一样。请有人帮助我。
答案 0 :(得分:4)
在调用super()
的默认构造函数之前,实例化Vertebrate
隐式调用Vertebrate
。这首先打印Mammal
。然后继续使用Mammal
的构造函数打印Rabbit
,最后打http://Dynamicweb8724.nl/webapi/NavToDW/?process="
。
对于更复杂/更高级的继承/构造函数/覆盖情况,我有一段时间written a Q+A。
答案 1 :(得分:0)
对超类的默认构造函数有一个隐式调用:
class Mammal extends Vertebrate {
public Mammal() {
super();
System.out.print("Mammal ");
}
}
答案 2 :(得分:0)
如您所知,首先执行main
方法。
所以这两行是按顺序执行的。
Mammal rabbit = new Mammal();
System.out.println("Rabbit");
所以你可以看到最后打印rabbit
的原因。
现在是第一行,
当你写Mammal rabbit = new Mammal();
时,你正在创建一个哺乳动物类的实例。
现在new Mammal()
调用mammal
类的构造函数。对于任何Java类,构造函数的第一行是this.super()
无论你是否编写它都无关紧要。 Java为你做到了。
所以在Mammal
构造函数里面是超类ie。 Vertebrate
首先被实例化。这导致脊椎动物在哺乳动物之前被打印。
答案 3 :(得分:0)
由于子类构造函数隐式调用super()
/ *在显式调用* /
的情况下,调用super()必须是子类构造函数中的第一个语句了解更多信息: http://docs.oracle.com/javase/tutorial/java/IandI/super.html