熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java類的完整構造執行順序

2022-06-13   來源: Java核心技術 

  這裡只說一個完整的結果至於為什麼是這樣的順序可以參考我以前的文章深入剖析java類的構造方式


    如果父類有靜態成員賦值或者靜態初始化塊執行靜態成員賦值和靜態初始化塊
    如果類有靜態成員賦值或者靜態初始化塊執行靜態成員賦值和靜態初始化塊
    將類的成員賦予初值(原始類型的成員的值為規定值例如int型為float型為fboolean型為false對象類型的初始值為null)
    如果構造方法中存在this()調用(可以是其它帶參數的this()調用)則執行之執行完畢後進入第步繼續執行如果沒有this調用則進行下一步(這個有可能存在遞歸調用其它的構造方法)
    執行顯式的super()調用(可以是其它帶參數的super()調用)或者隱式的super()調用(缺省構造方法)此步驟又進入一個父類的構造過程並一直上推至Object對象的構造
    執行類申明中的成員賦值和初始化塊
    執行構造方法中的其它語句

  其中第步是比較麻煩的因為this調用實際上會調用類的另外一個構造方法最終應該是執行類的某個構造方法它可能會顯示的調用super但是無論是否調用super最終都是執行super的也就是父類的構造方法並一直這樣遞歸到Object所以在子類和父類的構造中首先構造或者說執行的是父類的構造但是它是由子類的構造方法調用的先於構造方法的方法體裡面的內容這個是由編譯器決定的所以我感覺簡單直觀一些的順序表述應該是


    如果父類有靜態成員賦值或者靜態初始化塊執行靜態成員賦值和靜態初始化塊
    如果類有靜態成員賦值或者靜態初始化塊執行靜態成員賦值和靜態初始化塊
    將類的成員賦予初值(原始類型的成員的值為規定值例如int型為float型為fboolean型為false對象類型的初始值為null)
    執行構造方法並可能遞歸調用this()最終先執行父類的構造方法並一直遞歸到Object的構造方法的執行
    父類的構造方法執行完成後執行類申明中的成員賦值和初始化塊
    執行構造方法中的其它語句

  最終的簡化順序版本是


    父類的靜態成員賦值和靜態塊
    子類的靜態成員和靜態塊
    父類的構造方法
    父類的成員賦值和初始化塊
    父類的構造方法中的其它語句
    子類的成員賦值和初始化塊
    子類的構造方法中的其它語句

  日更新
    針對留言中提到的那個文章中的問題發現這個順序也是有不足的情況這個順序是一般的順序但是有可能被打破留言中的那篇文章就是一個例子因為在執行靜態初始化塊的時候先執行了類的構造打破了這個一般順序所以這個順序有個前提就是靜態賦值和初始化塊中沒有對本類的實例化語句
對於那個文章中的問題作者最後的解決方法可行但是不見得是最好的可以簡單的修改靜態賦值和靜態初始化塊的順序修改後的代碼片斷為
public class CachingEnumResolver {   
    private static Map CODE_MAP_CACHE;   
    /*MSGCODE>Category內存索引*/
    static {       
        CODE_MAP_CACHE = new HashMap();       
        //為了說明問題我在這裡初始化一條數據       
        CODE_MAP_CACHEput(北京市);
    }
    //單態實例 一切問題皆由此行引起   
    private static final CachingEnumResolver SINGLE_ENUM_RESOLVER = new    CachingEnumResolver(); 


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27010.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.