您好,
1) 按照你的解決方法思路就是在對象實例化之前JVM已經(jīng)調(diào)用了clinit()方法了,也就是類已經(jīng)初始化了,所以類變量也已經(jīng)初始化了我想問你這是怎么觸發(fā)類初始化的。
該問題在文中已有闡述:
* "Java 虛擬機規(guī)范為類的初始化時機做了嚴格定義:"initialize on first active use"--" 在首次主動使用時初始化"。"
*
首次主動使用的情形:
o 創(chuàng)建某個類的新實例時--new、反射、克隆或反序列化;
o 調(diào)用某個類的靜態(tài)方法時;
o 使用某個類或接口的靜態(tài)字段或?qū)υ撟侄钨x值時(final字段除外);
o 調(diào)用Java的某些反射方法時
o 初始化某個類的子類時
o 在虛擬機啟動時某個含有main()方法的那個啟動類。
2) 你在文章中提到init()方法包括了"所有具有指定初始化值的實例變量初始化語句",既然如此為什么沒有執(zhí)行CODE_MAP_CACHE = new HashMap()呢?
"CODE_MAP_CACHE = new HashMap()"語句是執(zhí)行了的,并非您理解的"沒有執(zhí)行",而是在對象實例化時調(diào)用initEnum()方法對CODE_MAP_CACHE初始化并賦值后,又重新在static{ ... }區(qū)塊內(nèi)進行了初始化。這是因為在類還未來得及初始化完畢時,在類自身有一條實例化自身的語句"private static final CachingEnumResolver SINGLE_ENUM_RESOLVER = new CachingEnumResolver();"所導(dǎo)致的。
回復(fù) 更多評論