總結類初始化時的程式碼執行順序

dijia478發表於2020-12-20

程式碼塊

在Java中,使用{}括起來的程式碼被稱為程式碼塊。

分類

根據其位置和宣告的不同,可以分為:

  1. 區域性程式碼塊:區域性位置,用於限定變數的生命週期。
  2. 構造程式碼塊:在類中的成員位置,用{}括起來的程式碼。每次呼叫構造方法執行前,都會先執行構造程式碼塊。作用:可以把多個構造方法中的共同程式碼放到一起,對物件進行初始化。
  3. 靜態程式碼塊:在類中的成員位置,用{}括起來的程式碼,只不過它用static修飾了。作用:一般是對類進行初始化。

上結論

  • 單個類中初始化過程:
  1. 初始化靜態成員變數和靜態程式碼塊(按次序)
  2. 執行main方法
  3. 初始化普通成員變數和構造程式碼塊(按次序)
  4. 執行構造方法

注意
靜態程式碼塊:只執行一次
構造程式碼塊:在每一次建立物件時執行

  • 涉及父類和子類的初始化過程:
  1. 初始化父類中的靜態成員變數和靜態程式碼塊(按次序)
  2. 初始化子類中的靜態成員變數和靜態程式碼塊(按次序)
  3. 執行子類main方法
  4. 初始化父類的普通成員變數和構造程式碼塊(按次序)
  5. 執行父類的構造方法(注意父類構造方法中的子類方法覆蓋)
  6. 初始化子類的普通成員變數和構造程式碼塊(按次序)
  7. 執行子類的構造方法

上程式碼

class Test {
  
    static {
        System.out.println("Test 靜態程式碼塊");
    }

    {
        System.out.println("Test 構造程式碼塊");
    }

    public Test() {
        System.out.println("Test 構造方法");
    }
  
}

public class TestDemo {
  
    static {
        System.out.println("TestDemo 靜態程式碼塊");
    }

    {
        System.out.println("TestDemo 構造程式碼塊");
    }

    public static void main(String[] args) {
        System.out.println("TestDemo main方法");

        Test t1 = new Test();
        Test t2 = new Test();
    }
  
}

其執行結果是:
TestDemo 靜態程式碼塊
TestDemo main方法
Test 靜態程式碼塊
Test 構造程式碼塊
Test 構造方法
Test 構造程式碼塊
Test 構造方法

public class Test extends MyClass {

    static {
        System.out.println("Test 靜態程式碼塊");
    }

    Person person = new Person("Test");

    {
        System.out.println("Test 構造程式碼塊");
    }

    public Test() {
        System.out.println("Test 構造方法");
    }

    public static void main(String[] args) {
        System.out.println("Test main方法");
        new Test();
    }

}

class Person {

    static {
        System.out.println("Person 靜態程式碼塊");
    }

    {
        System.out.println("Person 構造程式碼塊");
    }

    public Person(String str) {
        System.out.println("Person 構造方法,引數是" + str);
    }

}

class MyClass {

    static Person person = new Person("MyClass");

    static {
        System.out.println("MyClass 靜態程式碼塊");
    }

    {
        System.out.println("MyClass 構造程式碼塊");
    }

    public MyClass() {
        System.out.println("MyClass 構造方法");
    }

}

其執行結果是:
Person 靜態程式碼塊
Person 構造程式碼塊
Person 構造方法,引數是MyClass
MyClass 靜態程式碼塊
Test 靜態程式碼塊
Test main方法
MyClass 構造程式碼塊
MyClass 構造方法
Test 構造程式碼塊
Person 構造程式碼塊
Person 構造方法,引數是Test
Test 構造方法

相關文章