在Java中,當一個對象被創建時,它的構造函數會被調用,用于初始化對象的數據成員。但是,在構造函數被調用之前,Java編譯器會自動初始化對象的數據成員,包括基本類型和引用類型,這些數據成員的初始值取決于它們的數據類型。
//基本類型的初始值 int i = 0; double d = 0.0; boolean b = false; char c = '\u0000'; //引用類型的初始值 Object o = null; String s = null;
當Java編譯器在構造函數之前初始化數據成員時,初始化的順序是:
- 靜態成員變量(static variable)
- 實例變量(instance variable)
當創建對象時,Java虛擬機會按以下順序執行對象的初始化:
- 執行靜態代碼塊(static block)
- 在父類中遞歸初始化數據成員和調用父類的構造函數
- 執行實例代碼塊(instance block)
- 執行構造函數(constructor)
代碼如下:
public class MyClass { //靜態成員變量 static int count = 0; static { count++; } //實例變量 int num; { num = count; } //構造函數 public MyClass() { System.out.println("MyClass " + num + " is created."); } public static void main(String[] args) { MyClass obj1 = new MyClass(); MyClass obj2 = new MyClass(); } } //輸出結果: //MyClass 1 is created. //MyClass 2 is created.
以上代碼中,靜態代碼塊中的count會在程序運行時進行初始化。在創建第一個對象時,count的值變為1,然后通過實例代碼塊給num賦值,num的值也變成1,然后調用構造函數。創建第二個對象時,count的值變為2,num的值變成2,然后調用構造函數。因此,輸出結果為"MyClass 1 is created."和"MyClass 2 is created."。