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
只會針對當前所在類的成員變量創建構造函數,並不會去管父類的構造函數