通過實例解析Java類初始化和實例初始化
一、背景:
存在類Father和類Son,其中類Son繼承了Father類。
1.父類Father代碼
2.子類Son代碼
*初始化包括?
成員變量賦初值、代碼塊、構造器
注意方法是被調用的,有人調用它它才執行相應的東西。
二、類初始化
在一開始,注釋掉main方法中的代碼,執行結果如下。
類初始化:
1.創建實例需要先加載并初始化該類
此處main方法所在的類需要先加載并初始化
2.子類初始化要先初始化其父類
3.類初始化即是執行clinit(ClassInit)方法
A.(靜態!)分為 靜態變量的顯式賦值操作 和 靜態代碼塊B.上到下的順序執行C.這個clinit方法只執行一次
將父類中的static代碼塊放到靜態變量之前,可以看到結果按順序改變。
三、實例初始化
取消Son類中main方法的第一句注釋,如下圖所示。
此時將會先進行類初始化,再進行實例初始化,結果如下。
實例初始化:
1.實例初始化即是執行init方法
2.有幾個構造器就有幾個init方法,每次創建對象都會執行相應的init方法。
3.init方法由非靜態實例變量顯式賦值、非靜態代碼塊和相應的構造器組成。
4.非靜態實例變量賦值與非靜態代碼塊按上到下的順序執行,構造器在最后執行。
5.init方法的首行是super()或者帶參數的super(),即父類init方法。
父類中的test()方法輸出的是(4),為何父類中結果為932?
非靜態方法前有一個默認的對象this
this在構造器(或者init方法)表示的是正在創建的對象。
這里是在創建Son類的對象,所以執行的是重寫后的代碼。
四、總結
初始化操作包括成員變量、靜態/非靜態代碼塊和構造器。
1.先類初始化,再實例初始化。
2.都是先父類再子類。
3.類初始化關鍵詞'靜態'。
4.實例初始化關鍵詞'非靜態',構造器在最后。
5.注意構造器和實例初始化init方法中的this對象。
五、補充
哪些方法不能被重寫?
final方法 靜態方法 private等子類中不可見方法多態性的體現?
子類若重寫了父類的方法,則通過子類對象調用的一定是子類重寫過的方法 非靜態方法默認的調用對象是this this對象在構造器或者init方法中就是正在創建的對象以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。
相關文章: