關於jvm載入類的實現順序

daniel112發表於2009-06-16

public class CachingEnumResolver {

    private static Map CODE_MAP_CACHE;
    private static CachingEnumResolver SINGLE_ENUM_RESOLVER = new CachingEnumResolver();

    static {
        CODE_MAP_CACHE = new HashMap();
        CODE_MAP_CACHE.put( "0", "北京市" );
    }

    public static CachingEnumResolver getInstance() {
        return SINGLE_ENUM_RESOLVER;
    }

    public void initEnums() {

        if( null == CODE_MAP_CACHE ) {
            System.out.println( "CODE_MAP_CACHE為空,問題在這裡開始暴露." );
            CODE_MAP_CACHE = new HashMap();
        }
        CODE_MAP_CACHE.put( "1", "北京市" );
        CODE_MAP_CACHE.put( "2", "雲南省" );

    }

    public CachingEnumResolver() {
        initEnums();
    }

    public Map getCache() {
        return Collections.unmodifiableMap( CODE_MAP_CACHE );
    }

    public static void main(String[] ars){
        CachingEnumResolver resolver = CachingEnumResolver.getInstance();
        Map map = resolver.getCache();
        for( Object key : map.keySet() ) {
            System.out.print( key+"------------->" );
            System.out.print( map.get( key ));
        }
    }
}

 

結果:

CODE_MAP_CACHE為空,問題在這裡開始暴露.
0------------->北京市

看了一篇文章《神祕的類和物件初始化過程》,又熟悉了一遍關於jvm載入類的實現過程。總結了一下關於類的載入順序:

開始

1.靜態欄位
2.靜態塊

//如果你的呼叫為new,則繼續執行下面的。如果沒有new,而是通過靜態方法第一次訪問該類,則到此處就返回了。
3.欄位(非靜態塊)
4.建構函式


返回

 

父類1-->父類2-->子類1-->子類2-->父類3-->父類4-->子類3-->子類4

(以上說明先類的後物件的.在此基礎上先父類,後子類)-->先類先父
根據上面的例子說明一下:上面剛剛初始化靜態欄位的時候就有new的呼叫,所以先呼叫建構函式來執行。完成後執行靜態塊把原來賦好的值給覆蓋掉了,結果才出現那種情況。

 

相關文章