1. 靜態初始化塊
靜態初始化塊只在類首次加載時執行一次,同時靜態初始化塊只能給靜態變量賦值,不能給普通成員變量賦值。
2. (非靜態)初始化塊
(非靜態)初始化塊在每次生成實例對象時都執行一次,可以給任意變量賦值。
3. 構造方法
構造方法在每次生成實例對象時都執行一次
4. 執行順序:靜態初始化塊 ——> 初始化塊 ——> 構造方法
測試代碼如下:

1 public class Son extends Father { 2 static int sNum = 0; 3 int num = 0; 4 public static void main(String[] args){ 5 System.out.println("-----"); 6 new Father(); 7 System.out.println("-----"); 8 new Son(); 9 System.out.println("-----"); 10 System.out.println("sNum = " + sNum); 11 } 12 13 public Son() { 14 System.out.println("Son構造方法"); 15 } 16 17 static { 18 //num = 1; //報錯:無法為非靜態變量賦值 19 sNum = 1; 20 System.out.println("Son靜態初始化器"); 21 } 22 23 { 24 System.out.println("Son初始化塊"); 25 } 26 27 } 28 29 class Father { 30 { 31 System.out.println("Father初始化塊"); 32 } 33 34 public Father() { 35 System.out.println("Father構造方法"); 36 } 37 38 static { 39 System.out.println("Father靜態初始化器"); 40 } 41 }
測試結果如下:
總結:
- 靜態初始化塊的優先級最高,也就是最先執行,並且僅在類第一次被加載時執行;
- 非靜態初始化塊和構造函數后執行,並且在每次生成對象時執行一次;
- 非靜態初始化塊的代碼會在類構造函數之前執行。因此若要使用,應當養成把初始化塊寫在構造函數之前的習慣,便於調試;
- 靜態初始化塊既可以用於初始化靜態成員變量,也可以執行初始化代碼;
- 非靜態初始化塊可以針對多個重載構造函數進行代碼復用。