父子类继承时构造函数说明
1 手动创建构造器
一般来说一个类至少要有一个显式的无参构造函数。
但是有的题目会设置一个父类只有有参构造函数,而且由于显式声明了构造函数,隐式的无参构造函数就没了。
public class Father {
private int a;
public Father(int b){
this.a=b;
}
}
此时子类的所有构造函数必须都要有一个super(b)
字段,以满足父类的构造函数
public class Son extends Father{
private int c;
public Son(int b) {
super(b);
}
}
否则就会报错,如图,子类继承父类之后,写的无参构造和有参构造,如果不包含super(b)
字段,就会报错。
一句话,如果老子有需求(父类全是有参构造),儿子必须回应(子类的构造函数全要带上super(b)
)
但是父类有无参构造函数后,比如下面显式声明一个无参构造,又或者一个构造函数都不写,直接用隐式无参构造
public class Father {
private int a;
public Father(int b){
this.a=b;
}
public Father(){
}
}
子类就无所谓了,不带super(b)
字段就表示调用的是父类的无参构造,如图,报错全消失了
总结
如果父类只有带参数的构造函数,那么手动创建的构造器必须要使用super()
字段给父类构造函数传参,如果父类有无参构造,那么子类不使用super()
时,默认调用父类的无参构造
2 Lombok
如果项目使用了Lombok,那么如果父类只有有参构造函数,子类使用@NoArgsConstructor
和@AllArgsConstructor
会报错,因为这两个注解等同于生成子类的无参构造和全参构造,而这两种构造器均不带super(b)
字段
父类
public class Father {
private int a;
public Father(int a){
this.a=a;
}
}
子类使用Lombok会报错
此时子类即便写了一个带super(b)
字段的构造器,还是会报错,因为这两个注解给到的构造函数还是不包含父类
这两个注解就等价于下面这种情况(由于子类没有成员变量,全参构造注解等同于无参)
总结
@NoArgsConstructor
和@AllArgsConstructor
只会针对当前所在类的成员变量创建构造函数,并不会去管父类的构造函数