static標(biāo)明的變量、方法、代碼塊都屬于類所有,僅在類加載時進(jìn)行唯一一次初始化。
1.不管靜態(tài)成員變量聲明語句的實際位置在哪,當(dāng)?shù)谝淮渭虞d類的時候都會首先對它初始化缺省值(0,false,null)。
2.即使靜態(tài)成員變量聲明中使用了顯式初始化語句,第一次加載類的時候也會把它初始化缺省值。
3.對于靜態(tài)成員變量的顯示初始化語句和靜態(tài)初始化塊,按照在中代碼出現(xiàn)的先后順序執(zhí)行。
當(dāng)構(gòu)造類實例時候,會先對實例成員變量初始化缺省值,然后執(zhí)行初始化塊,然后執(zhí)行構(gòu)造方法
a.如同1中一樣,如果實例成員變量的顯式初始化語句,程序仍然是先將該成員變量初始化為缺省值,然后按照代碼在類中出現(xiàn)的先后順序執(zhí)行初始化或者初始化塊。
b.在進(jìn)入構(gòu)造方法后,如果構(gòu)造方法第一句是使用this,調(diào)用另一個構(gòu)造方法的話,則先執(zhí)行另一個構(gòu)造方法,然后再執(zhí)行本構(gòu)造方法的方法體。
public class Parent {
public void test() {
A = 3;System.out.println("test1方法" + A);}static {
System.out.println("Parent 靜態(tài)代碼塊執(zhí)行");A = 2;}public static int A =1;
public Parent(){System.out.println("Parent構(gòu)造方法執(zhí)行");}}
public class Son extends Parent {
public static int B = A;
static {
System.out.println("Son靜態(tài)代碼塊執(zhí)行");
}
public Son() {
System.out.println("Son構(gòu)造方法執(zhí)行");
}
}
public class Hello {
public static void main(String[] args) {Parent parent1 = new Parent();Parent parent2 = new Son();Son parent3 = new Son();
}}
1.實例化parent中靜態(tài)代碼塊、方法、變量,按照順序一個一個來,然后才是構(gòu)造方法。
2.實例化son,父類引用指向子類對象,先執(zhí)行父類的靜態(tài),然后是子類靜態(tài),然后父類構(gòu)造方法,然后是子類構(gòu)造方法
3.實例化son,執(zhí)行son中構(gòu)造方法,因為上面已經(jīng)執(zhí)行完靜態(tài),靜態(tài)僅在執(zhí)行一次。