類中可以擁有的成分
??? 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)建對象
典型的:使用類來聲明變量,并不算主動使用該類,所以不會初始化該類