這里只說一個完整的結果,至于為什么是這樣的順序,可以參考我以前的文章:深入剖析java類的構造方式
其中第4步是比較麻煩的,因為this調用實際上會調用類的另外一個構造方法,最終應該是執行類的某個構造方法,它可能會顯示的調用super,但是無論是否調用super,最終都是執行super的,也就是父類的構造方法并一直這樣遞歸到Object,所以在子類和父類的構造中,首先構造或者說執行的是父類的構造,但是它是由子類的構造方法調用的,先于構造方法的方法體里面的內容,這個是由編譯器決定的。所以我感覺簡單直觀一些的順序表述應該是:
最終的簡化順序版本是:
2006年11月16日更新:
    針對留言中提到的那個文章中的問題發現這個順序也是有不足的情況,這個順序是一般的順序,但是有可能被打破,留言中的那篇文章就是一個例子,因為在執行靜態初始化塊的時候先執行了類的構造,打破了這個一般順序。所以這個順序有個前提就是靜態賦值和初始化塊中沒有對本類的實例化語句。
對于那個文章中的問題,作者最后的解決方法可行,但是不見得是最好的,可以簡單的修改靜態賦值和靜態初始化塊的順序,修改后的代碼片斷為:
public class CachingEnumResolver {    
    PRivate static Map CODE_MAP_CACHE;    
    /*MSGCODE->Category內存索引*/
    static {        
        CODE_MAP_CACHE = new HashMap();        
        //為了說明問題,我在這里初始化一條數據        
        CODE_MAP_CACHE.put("0","北京市");
    }
    //單態實例 一切問題皆由此行引起    
    private static final CachingEnumResolver SINGLE_ENUM_RESOLVER = new    CachingEnumResolver(); 
新聞熱點
疑難解答