首先,明确一点,super(); 不是必须的。那么,什么时候需要在子类的构造函数上添加 super(); 呢?
1.当父类存在无参数构造函数时,JVM (我安装的是JDK1.8) 会在子类的构造函数中自动添加隐式的 super();,在注释的位置。因此,无需手动添加 super(); 。
class Super{
Super(){
System.out.println("Super");
}
}
class Demo extends Super{
Demo(){
//super();
System.out.println("Demo--");
}
Demo(String msg){
//super();
System.out.println("Demo--" + msg);
}
public static void main(String[] args) {
new Demo();
new Demo("test");
}
}
//返回结果:
//Super
//Demo--
//Super
//Demo--test
2.当父类中只存在有参数构造函数,必须在子类的构造函数中添加 super(参数列表);,且 super() 的参数列表必须与父类构造函数的参数列表相同。
当然,构造函数的参数列表可以任意,不过如果其不包含super()所需的全部参数,必须在子类中初始化成员变量。格式为 static 变量类型 变量名 = 常量;
class Super {
Super(String msg) {
System.out.println("Super--" + msg);
}
}
class Demo extends Super {
Demo(String msg) {
super(msg);
System.out.println("Demo--" + msg);
}
static String msg = "test2";
Demo(int x) {
super(msg);
System.out.println("Demo--" + x);
}
public static void main(String[] args) {
new Demo("test1");
new Demo(0);
}
}
//返回结果:
//Super--test1
//Demo--test1
//Super--test1
//Demo--0
总结: 实质上,添加 super(); 的目的是为了确保构造子类前,能成功地构造父类。也就是说,既然子类继承了父类的,只有当父类确实存在,子类才能够存在。