[Think in java]靜態資料的初始化
阿新 • • 發佈:2019-01-05
package com.test.two; public class Test4 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("creating new cupboard in main ...."); new Cupboard(); System.out.println("creating new cupboard in main...."); new Cupboard(); table.f2(1); cupboard.f3(2); } static Table table = new Table(); static Cupboard cupboard = new Cupboard(); } class Bowl{ Bowl(int marker){ System.out.println("Bowl(" + marker + ")"); } void f1(int marker){ System.out.println("f1(" + marker + ")"); } } class Table{ static Bowl bowl1 = new Bowl(1); Table(){ System.out.println("Table()"); bowl2.f1(1); } void f2(int marker){ System.out.println("f2(" + marker + ")"); } static Bowl bowl2 = new Bowl(2); } class Cupboard{ Bowl bowl3 = new Bowl(3); static Bowl bowl4 = new Bowl(4); Cupboard(){ System.out.println("Cupboard()"); bowl4.f1(2); } void f3(int marker){ System.out.println("f3(" + marker + ")"); } static Bowl bowl5 = new Bowl(5); }
==============output=====================
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
creating new cupboard in main ....
Bowl(3)
Cupboard()
f1(2)
creating new cupboard in main....
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(2)
=============分析===================
初始化的順序是先靜態物件,而後是"非靜態"物件。而且,靜態的物件只被初始化一次,之後不再被初始化。
總結一下物件的建立過程,假設有個名為Dog類:
1. 即使沒有顯式的使用static關鍵字,構造器實際上也是靜態方法。因此,當首次建立型別為Dog的物件時(構造器可以看成靜態方法),或者Dog類的靜態方法/靜態域首次被訪問時,Java直譯器必須查詢類路徑,以定位Dog.class檔案.
2. 然後載入Dog.class,有關靜態初始化的所有動作都會執行. 因此靜態初始化只在class物件首次載入的時候進行一次.
3. 當用new Dog()建立物件的時候,首先將在堆上為Dog物件分配足夠的儲存空間.
4. 這塊儲存空間會被清零,這就自動將Dog物件中的所有基本型別資料都設定成了預設值.而引用型別則被設定成了null.
5. 執行所有出現於欄位定義處的初始化動作.
6. 執行構造器.