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