Java - 26 程式碼塊
[修飾符 static]{
程式碼
};
類似於方法,沒有方法名,沒有返回,沒有引數
不用透過物件或類 顯式呼叫,而是在載入類 或 建立物件時 隱式呼叫
普通程式碼塊
好處
構造器的補充機制(減少程式碼重複冗餘),可以做初始化操作
/* 不管呼叫哪個構造器建立物件,都會先呼叫程式碼塊的內容 */
class Movie{
private String name;
private String director;
{
System.out.println("電影開始了");
}
public Movie(String name){
this.name = name;
}
public Movie(String name, String director){
this.name = name;
this.director = director;
}
}
細節
- 靜態程式碼塊 隨著類的載入而執行,只會執行一次
普通程式碼塊 每建立一個物件 (new, 和類載入無關) 就執行一次
類什麼時候被載入
-
建立物件例項 (new)
-
建立子類物件例項,父類也會被載入
-
使用類的靜態成員
- 建立一個物件,在一個類的呼叫優先順序
① 靜態程式碼和靜態屬性初始化(如果多個,按定義的順序呼叫)
A a = new A(); // (1)"getN1 被呼叫"; (2)"A 靜態程式碼塊01"
class A{
private static int n1 = getN1();
static{
System.out.println("A 靜態程式碼塊01");
}
public static int getN1(){
System.out.println("getN1 被呼叫");
return 100;
}
}
② 普通程式碼塊和普通屬性初始化(如果多個,按定義的順序呼叫)
③ 構造器
-
構造器 最前面隱含了 super() 和 呼叫普通程式碼塊
-
建立子類物件時,呼叫順序
① 父類的靜態程式碼塊和靜態屬性
② 子類的靜態程式碼塊和靜態屬性
③ 父類的普通程式碼塊和普通屬性初始化
④ 父類的構造方法
⑤ 子類的普通程式碼塊和普通屬性初始化
⑥ 子類的構造方法
- 靜態程式碼塊只能呼叫靜態成員,普通程式碼塊可以呼叫任意成員