早上看书重温了下继承关系中的构造器要求。其中对被继承的类,就是超类的构造器要求比较多。
直接看代码:
第一种情况,父类有参构造和无参构造器都在,那么子类,就随意了,编译的时候可以通过。
public class FatherConstructor {
public FatherConstructor() {
}
public FatherConstructor(int i) {
}
}
public class SonConstructor extends FatherConstructor{
public SonConstructor() {
}
public SonConstructor(int i){
}
}
第二种情况,父类有无参构造器,没有无参构造器,那么子类有参和无参构造器都只能调用超类无参的构造器,否则编译报错。
public class FatherConstructor {
public FatherConstructor() {
}
// public FatherConstructor(int i) {
//
// }
}
public class SonConstructor extends FatherConstructor{
public SonConstructor() {
}
public SonConstructor(int i){//编译报错:The constructor FatherConstructor(int) is undefined
super(i);//不写,默认都是调用super();
}
}
第三种情况,父类有有参构造器,没有无参构造器,要求子类构造器都必须显式调用超类的有参构造器,否则编译报错
public class FatherConstructor {
// public FatherConstructor() {
//
// }
public FatherConstructor(int i) {
}
}
public class SonConstructor extends FatherConstructor{
public SonConstructor() {//编译报错:Implicit super constructor FatherConstructor() is undefined. Must explicitly invoke another constructor
}
public SonConstructor(int i){
super(i);//编译通过
}
}
第四种情况,父类构造器不写,默认会有一个无参的构造器。子类要求只能调用父类无参构造器
public class FatherConstructor {
// public FatherConstructor() {
//
// }
// public FatherConstructor(int i) {
//
// }
}
public class SonConstructor extends FatherConstructor{//编译通过
public SonConstructor() {//隐式调用父类无参构造器
}
public SonConstructor(int i){
super();//显示调用父类无参构造器
}
}
总结:子类构造器,默认隐式调用父类的无参构造器。父类的构造器,默认会有一个隐式的无参构造器。父类构造器,如果只显示写一个有参的构造器,那么隐式的无参构造器默认就失效了。