這裡只說一個完整的結果
如果父類有靜態成員賦值或者靜態初始化塊
如果類有靜態成員賦值或者靜態初始化塊
將類的成員賦予初值(原始類型的成員的值為規定值
如果構造方法中存在this()調用(可以是其它帶參數的this()調用)則執行之
執行顯式的super()調用(可以是其它帶參數的super()調用)或者隱式的super()調用(缺省構造方法)
執行類申明中的成員賦值和初始化塊
執行構造方法中的其它語句
其中第
如果父類有靜態成員賦值或者靜態初始化塊
如果類有靜態成員賦值或者靜態初始化塊
將類的成員賦予初值(原始類型的成員的值為規定值
執行構造方法
父類的構造方法執行完成後
執行構造方法中的其它語句
最終的簡化順序版本是
父類的靜態成員賦值和靜態塊
子類的靜態成員和靜態塊
父類的構造方法
父類的成員賦值和初始化塊
父類的構造方法中的其它語句
子類的成員賦值和初始化塊
子類的構造方法中的其它語句
針對留言中提到的那個文章中的問題發現這個順序也是有不足的情況
對於那個文章中的問題
public class CachingEnumResolver {
private static Map CODE_MAP_CACHE;
/*MSGCODE
static {
CODE_MAP_CACHE = new HashMap();
//為了說明問題
CODE_MAP_CACHE
}
//單態實例 一切問題皆由此行引起
private static final CachingEnumResolver SINGLE_ENUM_RESOLVER = new CachingEnumResolver();
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27010.html