通過實例解析Java類初始化和實例初始化
一、背景:
存在類Father和類Son,其中類Son繼承了Father類。
1.父類Father代碼
2.子類Son代碼
*初始化包括?
成員變量賦初值、代碼塊、構(gòu)造器
注意方法是被調(diào)用的,有人調(diào)用它它才執(zhí)行相應(yīng)的東西。
二、類初始化
在一開始,注釋掉main方法中的代碼,執(zhí)行結(jié)果如下。
類初始化:
1.創(chuàng)建實例需要先加載并初始化該類
此處main方法所在的類需要先加載并初始化
2.子類初始化要先初始化其父類
3.類初始化即是執(zhí)行clinit(ClassInit)方法
A.(靜態(tài)!)分為 靜態(tài)變量的顯式賦值操作 和 靜態(tài)代碼塊
B.上到下的順序執(zhí)行
C.這個clinit方法只執(zhí)行一次
將父類中的static代碼塊放到靜態(tài)變量之前,可以看到結(jié)果按順序改變。
三、實例初始化
取消Son類中main方法的第一句注釋,如下圖所示。
此時將會先進(jìn)行類初始化,再進(jìn)行實例初始化,結(jié)果如下。
實例初始化:
1.實例初始化即是執(zhí)行init方法
2.有幾個構(gòu)造器就有幾個init方法,每次創(chuàng)建對象都會執(zhí)行相應(yīng)的init方法。
3.init方法由非靜態(tài)實例變量顯式賦值、非靜態(tài)代碼塊和相應(yīng)的構(gòu)造器組成。
4.非靜態(tài)實例變量賦值與非靜態(tài)代碼塊按上到下的順序執(zhí)行,構(gòu)造器在最后執(zhí)行。
5.init方法的首行是super()或者帶參數(shù)的super(),即父類init方法。
父類中的test()方法輸出的是(4),為何父類中結(jié)果為932?
非靜態(tài)方法前有一個默認(rèn)的對象this
this在構(gòu)造器(或者init方法)表示的是正在創(chuàng)建的對象。
這里是在創(chuàng)建Son類的對象,所以執(zhí)行的是重寫后的代碼。
四、總結(jié)
初始化操作包括成員變量、靜態(tài)/非靜態(tài)代碼塊和構(gòu)造器。
1.先類初始化,再實例初始化。
2.都是先父類再子類。
3.類初始化關(guān)鍵詞"靜態(tài)"。
4.實例初始化關(guān)鍵詞"非靜態(tài)",構(gòu)造器在最后。
5.注意構(gòu)造器和實例初始化init方法中的this對象。
五、補(bǔ)充
哪些方法不能被重寫?
- final方法
- 靜態(tài)方法
- private等子類中不可見方法
多態(tài)性的體現(xiàn)?
- 子類若重寫了父類的方法,則通過子類對象調(diào)用的一定是子類重寫過的方法
- 非靜態(tài)方法默認(rèn)的調(diào)用對象是this
- this對象在構(gòu)造器或者init方法中就是正在創(chuàng)建的對象
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Feign實現(xiàn)多文件上傳,Open?Feign多文件上傳問題及解決
這篇文章主要介紹了Feign實現(xiàn)多文件上傳,Open?Feign多文件上傳問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11SpringBoot JdbcTemplate批量操作的示例代碼
本篇文章主要介紹了SpringBoot JdbcTemplate批量操作的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04javaWeb如何實現(xiàn)隨機(jī)圖片驗證碼詳解
這篇文章主要給大家介紹了關(guān)于javaWeb如何實現(xiàn)隨機(jī)圖片驗證碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03