構造器面試題(有參構造的執行情況)

2021-10-18 19:33:51 字數 1076 閱讀 2877

理解下面的三個結論

class

apublica(

)publica(

int n)

}class

bextends

apublicb(

)publicb(

int n)

}public

class

test4

}

當呼叫了子類b的有參構造時,父類的構造器先執行肯定是確定無疑,但是是執行哪個構造器呢?執行結果如下:

執行結果中可以看到,父類a依然是執行了無參構造。

也就是說,如果子類構造器中未顯式指定父類構造器,那麼將會預設執行父類的無參構造【結論1】

換句話說,如果子類構造器中顯式指定父類構造器(即第一行加上super(n);),那麼將會執行父類的有參構造【結論2】

我們證明如下:(為了簡化,我們注釋掉靜態成員,從而更好的專注於問題)
當我們在子類中顯式地指定有參構造後(即在子類有參構造的第一行加上super

(n);),則輸出結果如下

子類中所有的構造器預設【預設:未顯式指定父類構造器】都會訪問父類中空引數的構造器【結論3】

證明如下:

我們注釋掉父類的無參構造,但是保留子類的無參構造,結果發生編譯錯誤

原因:所有的構造器包括子類中的無參構造,都會預設訪問父類中的無參構造,這裡子類中存在的無參構造器就沒有顯式指定父類構造器(子類中的有參構造器已經在第一行指定了父類構造器),但是父類中沒有無參構造。

解決辦法:我們可以注釋掉子類中的無參構造,這樣,子類中的所有構造器都顯式地指定了父類構造器。

帶有無參構造方法 有參構造方法的列舉

列舉就相當於乙個類,其中也可以定義構造方法,成員變數,普通方法和抽象方法。列舉元素必須位於列舉體中的最開始的位置,列舉元素類表的後要有分號與其他成員分隔。把列舉中的成員方法或變數等放在列舉元素的前面,編譯器報告錯誤。帶有構造方法的列舉 構造方法必須定義成私有的。如果有多個構造方法,該如何選擇哪個構造...

C 有參建構函式和無參建構函式的實現

建構函式是乙個特殊的成員函式,名字和類名相同,建立類型別物件時由編譯器自動呼叫,雖然建構函式名稱叫做構造,但是它的主要任務是初始化物件,而不是開空間建立物件,在物件的生命週期內只呼叫一次。如果使用者沒有編寫建構函式,則編譯器和自動提供乙個無引數的建構函式,這個函式就叫預設建構函式。建構函式其特徵如下...

九章演算法面試題42 構造MaxTree

給定乙個沒有重複元素的陣列a,定義a上的maxtree如下 maxtree的根節點為a中最大的數,根節點的左子樹為陣列中最大數左邊部分的maxtree,右子樹為陣列中最大數右邊部分的maxtree。請根據給定的陣列a,設計乙個演算法構造這個陣列的maxtree。如果能夠確定每個節點的父親節點,則可以...