Java高頻問題集:Top4.有關子類和父類的構造器的使用問題?

我們一起來看看有關Java構造器的一個常見問題。

1.為什麼在建立一個子類的物件時會呼叫父類的構造器?

class Super { String s; public Super(){ System。out。println(“Super”); }}public class Sub extends Super { public Sub(){ System。out。println(“Sub”); } public static void main(String[] args){ Sub s = new Sub(); }}

輸入結果

SuperSub

當一個類繼承了其它類時,在它的構造器中必須首先呼叫super()。如果super()沒有被呼叫,編譯器會在構造器的第一行自動插入對super()的呼叫。這就是在建立Sub物件時還呼叫Super類構造器的原因。

這裡只是建立了一個Sub物件,並不是兩個。父類的構造器被呼叫是為了幫助可能含有私有屬性的父類透過呼叫自身的構造器完成初始化工作 。

編譯器在子類的構造器中插入對父類的構造器的引用後,子類的構造器的程式碼如下所示

public Sub(){ super(); System。out。println(“Sub”);}

2.一個常見的錯誤資訊:父類的預設構造器未被定義

class Super { String s; public Super(String s){ this。s = s; } }public class Sub extends Super { int x = 200; public Sub(String s) { } public Sub(){ System。out。println(“Sub”); } public static void main(String[] args){ Sub s = new Sub(); }}

Java高頻問題集:Top4.有關子類和父類的構造器的使用問題?

很多Java研發人員應該都看到過的這樣的編譯錯誤資訊。這個錯誤產生的原因是父類的預設構造器未被定義。

在Java中,如果一個類沒有建立過構造器,編譯器將為其新增一個預設的無參構造器。如果這個類已經定義了構造器,例如上面的Super(String s),編譯器將不會再為其新增預設的無參構造器。

子類的構造器,無論是有參的還是無參的,都會呼叫父類的無參構造器。由於編譯器嘗試為子類的兩個構造器新增super()呼叫,但父類的預設建構函式沒有被定義,因此編譯器報錯。

有三種方式可以解決這個問題:

(1)。為父類新增無參的構造器

public Super(){ System。out。println(“Super”);}

(2)。移除父類中自定義的構造器

(3)。在子類的構造器中新增super(value)呼叫

3.在子類的構造器中顯式呼叫父類的構造器

public class Sub extends Super{ int x = 200; public Sub(String s) { super(s); } public static void main(String[] args) { Sub s = new Sub(“a”); }}class Super { String s; public Super(String s) { this。s = s; System。out。println(“Super s”); }}

在Sub類的有參構造器中顯式呼叫Super類的有參構造器。父類的有參構造器已定義,可以被呼叫。

4.規則

簡而言之,子類的構造器必須呼叫父類的構造器,其呼叫方式為研發人員顯式呼叫,或者編譯器隱式呼叫。無論採用哪種呼叫方式,供呼叫的父類的構造器都必須是已經定義過的。

請看上一篇

Java高頻問題集:Top3。為什麼不能覆蓋成員變數?

親愛的讀者,對此有什麼看法,歡迎在下方

評論區

留言討論哦。

長期堅持原創不易,如果文章引起大家共鳴,請大家

關注點贊轉發收藏

,支援我繼續創作,謝謝!