成員變量(字段)初始化順序
在一個類里初始化的順序是由成員變量在類里面的定義的順序來決定的。即使成員變量大量散布於類的各個方法定義的中間,那些成員變量仍會在調用任何方法之前得以初始化,甚至在構造函數調用之前。
若數據是靜態的(static),那么同樣的事情就會發生;如果它屬於一個基本類型(主類型),而且未對其初始化,就會自動獲得自己的標准基本類型初始值;如果它是指向一個對象的句柄,那么除非新建一個對象,並將句柄同它連接起來,否則就會得到一個空值(NULL)。
static 初始化只有在必要的時候才會進行。如果不創建一個Table 對象,而且永遠都不引用Table.b1 或Table.b2,那么static Bowl b1 和b2 永遠都不會創建
對象創建過程
- 類型為Dog的一個對象首次創建時,或者Dog類的static字段或static方法首次訪問時,Java解釋器必須找到Dog.class(在事先設定好的路徑里面搜索);
-
找到Dog.class 后(它會創建一個Class 對象),它的所有static 初始化模塊都會運行。因此,static 初始化僅發生一次——在Class 對象首次載入的時候;
-
創建一個new Dog()時,Dog 對象的構建進程首先會在內存堆(Heap)里為一個Dog 對象分配足夠多的存儲空間;
-
這種存儲空間會清為零,將Dog 中的所有基本類型(Primitive)設為它們的默認值(0用於數字,以及boolean 和char 的等價設定);
-
進行成員字段定義時發生的所有初始化都會執行;
-
執行構造函數。
static構建從句
class Spoon { static int i; static { i = 47; } // . . .
盡管看起來象個方法,但它實際只是一個static關鍵字,后面跟隨一個方法主體。與其他static初始化一樣,這段代碼僅執行一次——首次生成那個類的一個對象時,或者首次訪問屬於那個類的一個static 成員時(即便從未生成過那個類的對象)