国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java類的完整構造執行順序

2019-11-18 11:02:01
字體:
來源:轉載
供稿:網友

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

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

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

  1. 假如父類有靜態成員賦值或者靜態初始化塊,執行靜態成員賦值和靜態初始化塊
  2. 假如類有靜態成員賦值或者靜態初始化塊,執行靜態成員賦值和靜態初始化塊
  3. 將類的成員賦予初值(原始類型的成員的值為規定值,例如int型為0,float型為0.0f,boolean型為false;對象類型的初始值為null)
  4. 執行構造方法,并可能遞歸調用this(),最終先執行父類的構造方法并一直遞歸到Object的構造方法的執行
  5. 父類的構造方法執行完成后,執行類申明中的成員賦值和初始化塊。
  6. 執行構造方法中的其它語句。

最終的簡化順序版本是:

  1. 父類的靜態成員賦值和靜態塊
  2. 子類的靜態成員和靜態塊
  3. 父類的構造方法
  4. 父類的成員賦值和初始化塊
  5. 父類的構造方法中的其它語句
  6. 子類的成員賦值和初始化塊
  7. 子類的構造方法中的其它語句

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(); 



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 尼玛县| 伊金霍洛旗| 宿州市| 安吉县| 凤翔县| 桂平市| 高阳县| 嘉鱼县| 安仁县| 丹巴县| 佛坪县| 和林格尔县| 丰都县| 浦县| 平顺县| 廊坊市| 汪清县| 阿拉善左旗| 茂名市| 冕宁县| 峨眉山市| 长汀县| 栾城县| 皋兰县| 衢州市| 建始县| 洪雅县| 钟祥市| 临桂县| 错那县| 两当县| 康保县| 塘沽区| 临沧市| 柳江县| 自治县| 师宗县| 河津市| 株洲县| 若尔盖县| 高邑县|