父子類繼承時構造函數說明


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)

image

但是父類有無參構造函數后,比如下面顯式聲明一個無參構造,又或者一個構造函數都不寫,直接用隱式無參構造

public class Father {
    private int a;
    public Father(int b){
        this.a=b;
    }
    
    public Father(){
        
    }
}

子類就無所謂了,不帶super(b)字段就表示調用的是父類的無參構造,如圖,報錯全消失了

image

總結

如果父類只有帶參數的構造函數,那么手動創建的構造器必須要使用super()字段給父類構造函數傳參,如果父類有無參構造,那么子類不使用super()時,默認調用父類的無參構造

2 Lombok

如果項目使用了Lombok,那么如果父類只有有參構造函數,子類使用@NoArgsConstructor@AllArgsConstructor會報錯,因為這兩個注解等同於生成子類的無參構造和全參構造,而這兩種構造器均不帶super(b)字段

父類

public class Father {
    private int a;
    public Father(int a){
        this.a=a;
    }
}

子類使用Lombok會報錯

image

此時子類即便寫了一個帶super(b)字段的構造器,還是會報錯,因為這兩個注解給到的構造函數還是不包含父類

image

這兩個注解就等價於下面這種情況(由於子類沒有成員變量,全參構造注解等同於無參)

image

總結

@NoArgsConstructor@AllArgsConstructor只會針對當前所在類的成員變量創建構造函數,並不會去管父類的構造函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM