當(dāng)類第一次加載到內(nèi)存中的時(shí)候初始化
- 父類靜態(tài)成員和靜態(tài)初始化塊会涎,按在代碼中出現(xiàn)的順序依次執(zhí)行。
- 子類靜態(tài)成員和靜態(tài)初始化塊葡秒,按在代碼中出現(xiàn)的順序依次執(zhí)行斯入。
- 父類的實(shí)例成員和實(shí)例初始化塊肌索,按在代碼中出現(xiàn)的順序依次執(zhí)行蕉拢。
- 執(zhí)行父類的構(gòu)造方法。
- 子類實(shí)例成員和實(shí)例初始化塊诚亚,按在代碼中出現(xiàn)的順序依次執(zhí)行晕换。
- 執(zhí)行子類的構(gòu)造方法。
非靜態(tài)初始化塊和靜態(tài)初始化塊的區(qū)別站宗?
- 非靜態(tài)初始化塊主要用于對(duì)象的初始化闸准,每次創(chuàng)建對(duì)象都要調(diào)用一次,其執(zhí)行順序在構(gòu)造方法之前梢灭。
- 靜態(tài)初始化塊主要用來初始化靜態(tài)變量夷家,只調(diào)用一次,類第一次加載到內(nèi)存中調(diào)用敏释。
- 非靜態(tài)成員變量不能在靜態(tài)方法中使用库快,同樣也不能在靜態(tài)初始化中初始化
如何驗(yàn)證靜態(tài)變量和靜態(tài)初始化塊按代碼出現(xiàn)順序
public class TestOrder {
// 靜態(tài)初始化塊
static {
System.out.println("靜態(tài)初始化塊");
}
// 靜態(tài)變量
public static TestA a = new TestA();
// 靜態(tài)變量
public static TestB b = new TestB();
public static void main(String[] args) {
new TestOrder();
}
}
class TestA {
public TestA() {
System.out.println("Test--A");
}
}
class TestB {
public TestB() {
System.out.println("Test--B");
}
}
這段代碼巧妙運(yùn)用了類初始化會(huì)調(diào)用構(gòu)造方法,讓人可以直觀的看到變量的初始化過程钥顽。