Java:初始化塊、靜態初始化塊、構造方法的執行順序


 

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 }
View Code

 

測試結果如下:

總結: 

  1. 靜態初始化塊的優先級最高,也就是最先執行,並且僅在類第一次被加載時執行;
  2. 非靜態初始化塊和構造函數后執行,並且在每次生成對象時執行一次;
  3. 非靜態始化塊的代碼會在類構造函數之前執行。因此若要使用,應當養成把初始化塊寫在構造函數之前的習慣,便於調試;
  4. 靜態初始化塊既可以用於初始化靜態成員變量,也可以執行初始化代碼
  5. 非靜態初始化塊可以針對多個重載構造函數進行代碼復用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM