成員變數(欄位)初始化順序
在一個類裡初始化的順序是由成員變數在類裡面的定義的順序來決定的。即使成員變數大量散佈於類的各個方法定義的中間,那些成員變數仍會在呼叫任何方法之前得以初始化,甚至在建構函式呼叫之前。
若資料是靜態的(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 成員時(即便從未生成過那個類的物件)