java语言规定,在执行该类构造前必须先执行父类的构造,直到Object类的构造。
因此任何构造的第一句,必须执行父类的构造,如果没有添加super(),那么编译器会为该构造默认添加一个super()。如果使用super显示的调用父类构造,就用指定的那个父类构造,否则使用默认的无参构造。
但该类构造中出现了this()时,会在该构造中调用本类的其他构造,但最终还是会在调用链的底端调用到父类的构造。所以如果super()和this()同时存在,那么就会出现两次初始化父类。第一次是super()调用父类构造,第二次是this()调用链底端的子类构造里调用父类构造,这样就造成两次调用super。
class Father{
public Father(){}
}
class Son extends Father{
public Son(){
super();//第一次调用super()
this(1);//编译器报错
}
public Son(int a){
//第二次隐式调用super()
}
}
但如果父类没有提供无参构造,则需在子类构造中显示调用super()
class Father{
public Father(int a){
}
}
class Son extends Father{
public Son(){} //编译报错,需加入super(1)
}