Java初始化塊

類中可以擁有的成分

??? 1. Field?????? ? ? ? ? ? ? ? ?? (有static類來調(diào)用,沒有實例調(diào)用)

??? 2. 方法

??? 3. 構(gòu)造器???????????????????? (new 來調(diào)用)

??? 4. 初始化塊?????????????????? ——? 它是沒有名字!

??? 5. 內(nèi)部類/枚舉/接口

執(zhí)行性語句(包括循環(huán)、分支、創(chuàng)建對象、賦值、調(diào)用方法),只能放在方法、構(gòu)造器、初始化塊。

???

初始化塊的語法:

??? [修飾符]{

??????????? // 可執(zhí)行性的語句。

????? }

???? 修飾符? —? 【只能】出現(xiàn)? 【static】

????????????????????????? 有 static ,說明它是類初始化塊。(靜態(tài)初始化塊)

? ? ? ? ? ? ? ? ? ? ? ? ? 沒有 static,說明它是實例初始化塊。(非靜態(tài)初始化塊)

??? 由于初始化塊沒有名字,所以它只能被 “隱式” 執(zhí)行。

實例初始化塊

?? 1. 實例初始化塊到底何時被執(zhí)行?

????????? 實例初始化塊的代碼,會在【每次調(diào)用構(gòu)造器之前】被隱式執(zhí)行。

?????? 規(guī)則:【位于構(gòu)造器前面】的、而且【無需傳入?yún)?shù)】的代碼就可被提取到初始化塊中。

? 實例初始化塊和構(gòu)造器的作用幾乎是相同的,但實例初始化塊的優(yōu)先級更高,

? ? ? ? ? ? ? 實例初始化塊包含的代碼,總是在構(gòu)造器包含的代碼之前執(zhí)行。

? ? 2. Java 允許提供多個實例初始化塊,但至少目前沒有多個實例初始化塊的價值

????????? 所以不如合并成一個。

??? 3. JDK 編譯器會把【實例初始化塊的代碼】,【聲明Field 時候指定初始值的代碼】都提取出來,并“插”到構(gòu)造器里的【最前面】

【實例初始化塊的代碼】與【聲明Field 時候指定初始值的代碼】按照他們在源代碼中的順序執(zhí)行

初始化塊?? 程序 及 運行結(jié)果:

public class 初始化塊

{

??? double weight = 12.3; // 【聲明Field 時候指定初始值的代碼】在【實例初始化塊的代碼】之前,所以輸出20.3

??? String name;

??? // 這就叫初始化塊

??? {

? ?? ?? weight = 20.3;

? ?? ?? System.out.println("正在執(zhí)行實例初始化塊");

??? }

??? //double weight = 12.3;

??? public 初始化塊()? //? 創(chuàng)建 無參數(shù) 構(gòu)造器

??? {

? ?? ?? System.out.println("--正在執(zhí)行 初始化塊 無參數(shù)的構(gòu)造器--");

??? }

??? public 初始化塊(String name)? //? 創(chuàng)建 有參數(shù) 構(gòu)造器

??? {

? ?? ?? this.name = name;

? ?? ?? System.out.println("--正在執(zhí)行 初始化塊 無參數(shù)的構(gòu)造器--");

??? }

??? public void info()

??? {

? ?? ?? System.out.println("名字:" + name + ",體重是:" + weight);

??? }

??? public static void main(String[] args)

??? {

? ? ? ? 初始化塊 an = new 初始化塊();

? ? ? ? an.info();

? ?? ?? 初始化塊 an2 = new 初始化塊("懶羊羊");

??????? an2.info();

??? }

}

初始化塊

類初始化塊

???????? 它負責對類進行初始化。

????????????? 當類被加載后,對類初始化后時被隱式執(zhí)行

??????? 一個JVM,對一個類,只初始化一次,因此類初始化只有一次執(zhí)行的機會。

類初始化

???? 當程序第一次【主動】使用該類就會初始化該類。下面幾種情況會初始化該類:

???? 1. 訪問了該類靜態(tài)Field 或靜態(tài)方法

???? 2. 初始化了該類的子類——因為Java初始化一個類,永遠先從最頂層父類(object)開始初始化。

???? 3. 使用反射來 Class.forName(類名字符串)

???? 4. 如果該類作為主類使用(有main方法,而且程序確實從該main方法開始執(zhí)行)

???? 5.使用該類來創(chuàng)建對象

典型的:使用類來聲明變量,并不算主動使用該類,所以不會初始化該類

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容