理解下面的三個結論
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。如果能夠確定每個節點的父親節點,則可以...