天天看點

Java的static修飾變量,方法,代碼塊的初始化順序Java的static修飾變量,方法,代碼塊的初始化順序

  • Java的static修飾變量方法代碼塊的初始化順序
    • 測試代碼
    • 運作結果
    • 分析結果
    • 總結
    • 轉載

Java的static修飾變量,方法,代碼塊的初始化順序

測試代碼

package test;

public class Test {

    static String a = "string-a";
    static String b;
    String c = "stirng-c";
    String d;

    static {
        printStatic("before static");
        b = "string-b";
        printStatic("after static");
    }

    public Test() {
        print("before constructor");
        d = "string-d";
        print("after constructor");
    }

    public static void main(String[] args) {
        new Test();
    }

    public static void printStatic(String title) {
        System.out.println("---------" + title + "---------");
        System.out.println("a = \"" + a + "\"");
        System.out.println("b = \"" + b + "\"");
    }

    public void print(String title) {
        System.out.println("---------" + title + "---------");
        System.out.println("a = \"" + a + "\"");
        System.out.println("b = \"" + b + "\"");
        System.out.println("c = \"" + c + "\"");
        System.out.println("d = \"" + d + "\"");
    }
}
           

運作結果

---------before static---------
a = "string-a"
b = "null"
---------after static---------
a = "string-a"
b = "string-b"
---------before constructor---------
a = "string-a"
b = "string-b"
c = "stirng-c"
d = "null"
---------after constructor---------
a = "string-a"
b = "string-b"
c = "stirng-c"
d = "string-d"
           

分析結果

  1. static函數在constructor函數之前。 這是因為static修飾的變量和代碼塊在JVM加載該類的時候就執行了,而constructor是在執行個體化的時候才執行。
  2. 修改測試代碼,将static修飾的變量放到static修飾代碼塊之後,發現before static的結果都為null,說明static修飾的代碼塊和變量初始化順序是誰寫在前面誰先初始化。
  3. 無法分析類的非靜态變量和靜态變量誰先初始化,需要研究JVM的實作。

總結

Java 類屬性和對象屬性的初始化順序

1. static修飾的變量和代碼塊,兩者的先後取決于誰寫在前面

2. 對象的非靜态變量

3. 構造函數的初始化代碼

轉載

Erola