demo
/**
* 構(gòu)造中打印Log逾苫,便于觀察加載順序
*/
public class Cup {
public Cup(String container) {
Log.e("AppTest", "Cup " + container);
}
}
/**
* Table類,可以放置Cup
* 包含靜態(tài)屬性枚钓、靜態(tài)代碼塊铅搓、動態(tài)屬性、構(gòu)造的Table類
*/
static Cup cup = new Cup("on Table static");
Cup cup1 = new Cup("on Table non-static");
static {
Log.e("AppTest", "Table static block");
}
public Table() {
Log.e("AppTest", "init Table");
}
}
/**
* TeaTable類搀捷,繼承自Table
* 且擁有自己的靜態(tài)屬性星掰、靜態(tài)代碼塊、動態(tài)屬性嫩舟、構(gòu)造
*/
public class TeaTable extends Table {
static Cup cup = new Cup("on TeaTable static");
Cup cup1 = new Cup("on TeaTable non-static");
static {
Log.e("AppTest", "TeaTable static block");
}
public TeaTable() {
Log.e("AppTest", "init TeaTable");
}
}
/**
* BigTeaTable 類氢烘,繼承自TeaTable,
* 同樣擁有自己的靜態(tài)屬性家厌、靜態(tài)代碼塊播玖、動態(tài)屬性、構(gòu)造
*/
public class BigTeaTable extends TeaTable{
static {
Log.e("AppTest", "BigTeaTable static block");
}
static Cup cup = new Cup("on BigTeaTable static");
Cup cup1 = new Cup("on BigTeaTable non-static");
public BigTeaTable() {
Log.e("AppTest", "init BigTeaTable");
}
}
/**
* Cupboard類饭于,也可以裝cup
* 擁有自己的靜態(tài)屬性蜀踏、靜態(tài)代碼塊维蒙、動態(tài)屬性、構(gòu)造
*/
public class Cupboard {
static Cup cup = new Cup("in Cupboard static");
Cup cup1 = new Cup("in Cupboard non-static");
static {
Log.e("AppTest", "Cupboard static block");
}
public Cupboard() {
Log.e("AppTest", "init Cupboard");
}
}
/**
* 測試Main方法
*/
main() {
new BigTeaTable();
}
/**
* Log輸出
*/
06-13 12:26:01.963 E/AppTest: Cup on Table static
06-13 12:26:01.963 E/AppTest: Table static block
06-13 12:26:01.963 E/AppTest: Cup on TeaTable static
06-13 12:26:01.963 E/AppTest: TeaTable static block
06-13 12:26:01.963 E/AppTest: BigTeaTable static block
06-13 12:26:01.963 E/AppTest: Cup on BigTeaTable static
06-13 12:26:01.963 E/AppTest: Cup on Table non-static
06-13 12:26:01.963 E/AppTest: init Table
06-13 12:26:01.963 E/AppTest: Cup on TeaTable non-static
06-13 12:26:01.963 E/AppTest: init TeaTable
06-13 12:26:01.964 E/AppTest: Cup on BigTeaTable non-static
06-13 12:26:01.964 E/AppTest: init BigTeaTable
結(jié)論
類加載時果覆,會首先初始化靜態(tài)屬性颅痊、執(zhí)行靜態(tài)代碼塊,順序?yàn)榇a聲明順序局待。如果有繼承斑响,則先加載父類的,然后加載子類燎猛。
如demo中Table恋捆、TeaTable、BigTeaTable最先加載完畢重绷。而且BigTeaTable中靜態(tài)代碼塊是定義在靜態(tài)屬性之前沸停,所以會按定義順序加載。靜態(tài)部分加載完成后昭卓,加載非靜態(tài)部分愤钾,最后加載構(gòu)造。如果有繼承則先加載父類的非靜態(tài)及構(gòu)造候醒,然后加載子類能颁。如Log所示。
靜態(tài)屬性及代碼塊只有在首次初始化改類倒淫,或者首次調(diào)用時才會加載伙菊。
如demo中的Cupboard未被初始化和調(diào)用,所以靜態(tài)屬性就沒有加載敌土。
參考
- 《Thinking in Java》第5章 第5.7節(jié) 構(gòu)造器初始化