- 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"
分析結果
- static函數在constructor函數之前。 這是因為static修飾的變量和代碼塊在JVM加載該類的時候就執行了,而constructor是在執行個體化的時候才執行。
- 修改測試代碼,将static修飾的變量放到static修飾代碼塊之後,發現before static的結果都為null,說明static修飾的代碼塊和變量初始化順序是誰寫在前面誰先初始化。
- 無法分析類的非靜态變量和靜态變量誰先初始化,需要研究JVM的實作。
總結
Java 類屬性和對象屬性的初始化順序
1. static修飾的變量和代碼塊,兩者的先後取決于誰寫在前面
2. 對象的非靜态變量
3. 構造函數的初始化代碼
轉載
Erola