Java 中的程式碼塊

ifreeky發表於2019-04-30

1. 普通程式碼塊

  • 說明:普通程式碼塊在方法體中定義,也可以定義在構造程式碼塊和靜態程式碼塊中。
  • 格式
    public class Demo {
    
        public static void main(String[] args) {
            {
                System.out.println("main 方法中的普通程式碼塊1");
                {
                    System.out.println("main 方法中的普通程式碼塊2");
                }
                {
                    System.out.println("main 方法中的普通程式碼塊3");
                }
            }
        }
    }
    複製程式碼
  • 編譯結果
    public class Demo {
    
        public static void main(String[] args) {
            {
                System.out.println("main 方法中的普通程式碼塊1");
                {
                    System.out.println("main 方法中的普通程式碼塊2");
                }
                {
                    System.out.println("main 方法中的普通程式碼塊3");
                }
            }
        }
    }
    複製程式碼
    • 注:普通程式碼塊編譯後直接去掉了{}
  • 執行順序:普通程式碼塊的執行順序按照書寫順序
  • 執行結果
    main 方法中的普通程式碼塊1
    main 方法中的普通程式碼塊2
    main 方法中的普通程式碼塊3
    複製程式碼

2. 構造程式碼塊

  • 說明:構造程式碼塊指的是直接在Java類中使用{}宣告的程式碼塊,與靜態程式碼塊相比少了static 關鍵字。
  • 構造程式碼塊的呼叫依賴物件的生成,但是執行順序優先與構造方法。
  • 格式
    public class Demo {
    
        {
            System.out.println("執行構造程式碼塊1");
        }
    
        public Demo() {
            System.out.println("無參構造器");
        }
    
        public Demo(int i) {
            System.out.println("有參構造器");
        }
    
        public static void main(String[] args) {
            System.out.println("執行 main 方法");
            new Demo();
        }
    
        {
            System.out.println("執行構造程式碼塊2");
        }
    }
    複製程式碼
  • 編譯結果
    public class Demo {
        public Demo() {
            System.out.println("執行構造程式碼塊1");
            System.out.println("執行構造程式碼塊2");
            System.out.println("無參構造器");
        }
    
        public Demo(int i) {
            System.out.println("執行構造程式碼塊1");
            System.out.println("執行構造程式碼塊2");
            System.out.println("有參構造器");
        }
    
        public static void main(String[] args) {
            System.out.println("執行 main 方法");
            new Demo();
        }
    }
    複製程式碼
  • 注:通過反編譯結果可知,構造程式碼塊在編譯後直接插入到了對應類的構造方法最前端,順序依據書寫順序,有多個構造方法即會插入多次。因為插入在最前端,所以優先於構造方法執行。
  • 執行順序:物件例項化時,優於構造器執行。
  • 執行結果:
    執行 main 方法
    執行構造程式碼塊1
    執行構造程式碼塊2
    無參構造器
    複製程式碼

3. 靜態程式碼塊

  • 說明:靜態程式碼塊與構造程式碼塊相同,都是寫在Java類中,不能寫在方法中。不同的是靜態程式碼塊需要用static關鍵字修飾。
  • 格式
    public class Demo {
    
       static  {
            System.out.println("靜態程式碼塊1");
        }
    
        public static void main(String[] args) {
            System.out.println("執行 main 方法");
        }
    
        static  {
            System.out.println("靜態程式碼塊2");
        }
    }
    
    複製程式碼
  • 編譯結構
    public class Demo {
        public Demo() {
        }
    
        public static void main(String[] args) {
            System.out.println("執行 main 方法");
        }
    
        static {
            System.out.println("靜態程式碼塊1");
            System.out.println("靜態程式碼塊2");
        }
    }
    複製程式碼
  • 注:靜態程式碼塊編譯後將多個靜態程式碼塊的內容整合成了一個靜態程式碼塊,順序按照書寫順序。
  • 執行順序:類載入時執行一次。
  • 執行結果
靜態程式碼塊1
靜態程式碼塊2
執行 main 方法
複製程式碼

4. 繼承結構下的程式碼塊

  • 在繼承結構中,程式碼的載入順序會先載入父類,然後載入子類。
  • 例項化時,也會先例項化父類,然後是子類。

5. 總結

  • 執行順序
    • 非繼承結構:靜態程式碼塊 > 構造程式碼塊 > 構造方法 > 普通程式碼塊 
    • 繼承結構:父類靜態程式碼塊 > 子類靜態程式碼塊 > 父類構造程式碼塊 > 父類構造方法 > 子類構造程式碼塊 > 子類構造方法 > 普通程式碼塊
一家之言,姑妄視之。才疏學淺,還望斧正。
複製程式碼

相關文章