<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-55  評論-208  文章-0  trackbacks-0
    昨天在改一處代碼時發現執行的過程和預想的不一樣,仔細探究才發現是構造器執行順序問題.(汗自己一下,基礎不夠扎實)
    特地做了一些嘗試然后把java構造器的執行順序整理出來.
    首先是我測試的代碼:
    public class Son extends Father {
        SonProp r 
    = new SonProp();
        
    public Son() {
            System.out.println(
    "Son is construct");
        }

        
    public static void main(String[] args) {
            
    new Son();
        }

    }

    class Father {
        FatherProp SonProp 
    = new FatherProp();
        
    public Father() {
            System.out.println(
    "Father is construct");
        }

    }

    class SonProp {
        
    public SonProp() {
            System.out.println(
    "SonProp is construct");
        }

    }

    class FatherProp {
        
    public FatherProp() {
            System.out.println(
    "FatherProp is construct");
        }

    }
    執行結果如下:
    FatherProp is construct
    Father is construct
    SonProp is construct
    Son is construct

    由此不難看出java類初始化時構造函數調用順序:
      (1)初始化對象的存儲空間為零或null值;
      (2)按順序分別調用父類成員變量和實例成員變量的初始化表達式;
      (3)調用父類構造函數;(如果實用super()方法指定具體的某個父類構造函數則使用指定的那個父類構造函數)
      (4)按順序分別調用類成員變量和實例成員變量的初始化表達式;
      (5)調用類本身構造函數。

    posted on 2008-05-27 11:43 rocket 閱讀(8211) 評論(6)  編輯  收藏 所屬分類: 經驗積累

    評論:
    # re: 一個以前沒有注意的問題:java構造函數的執行順序 2008-05-27 11:46 | 基金凈值
    我也才知道,謝謝!  回復  更多評論
      
    # re: 一個以前沒有注意的問題:java構造函數的執行順序 2008-05-27 12:30 | 隔葉黃鶯
    借用我在 http://m.tkk7.com/cheneyfree/archive/2008/05/24/202643.html 里寫的回復,再次貼來這里來,與博主共勉

    1. 初始化分為為的初始化和實例的初始化
    2. 每個類在 JVM 中都對應一個 Class 實例
    3. 父類實例是作為子例的部分存在的 (Class 實例之間也存在父子關系)
    4. 初始化實例之前要初始化類

    基于以上幾點就可以理解以下初始化順序
    1. 父類靜態屬性、靜態類 (父類的初始化,對應 JVM 方法 cinit())
    2. 子類的靜態屬性、靜態類 (子類的初始化,對應 JVM 方法 cinit())
    3. 父類的實例構造,實例變量初始化 (實例變量初始實際會放到 JVM 的 init() 中)
    4. 子類的實例構造,實例變量初始化 (也是對應的 init() 方法)

    關于類的 Class 實例,可以回想 Log 的聲明
    Log log = LogFactory.getLog(TestClass.class);
    也就是無論你,new 多少個 TestClass 實例,它們對應著同一個 TestClass 的 Class 實例,也就是為什么很多地方把靜態方法、靜態屬性說成是類的方法、類的屬性,其實質就是在 JVM 中存在同一個 Class 實例的方法、屬性,也就能保持一致性。

    關于父類實例是作為子類的一部分存在,可借鑒 C++ 或是有面向對象特性的 C 函數庫(如 gtk),來理解,父類實例會居于子類實例的首地址,所以對子類轉型成父類實例時,它是安全的,因為首地址一樣的,所以從首地址到 size(父類)就是父類實例地址空間,到size(子類)就是子類實例的地址空間。  回復  更多評論
      
    # re: 一個以前沒有注意的問題:java構造函數的執行順序 2008-05-27 13:02 | rocket
    @隔葉黃鶯

    呵呵,還是我們的黃鶯扎實啊,以前還真沒有仔細研究過jvm。這就去仔細找資料看看。  回復  更多評論
      
    # re: 一個以前沒有注意的問題:java構造函數的執行順序 2008-05-27 17:33 | deathnote
    筆試了幾次,基礎很重要啊,收下了。。。。  回復  更多評論
      
    # re: 一個以前沒有注意的問題:java構造函數的執行順序 2008-05-28 20:49 | Jack.Wang
    LZ 真強大,看來你的 oo 還是不行啊!
    最近聽一個牛人(國外留學的 doctor),講中間件的時候講幾次內存模型。真的受益匪淺,改天去你們公司分享一下!  回復  更多評論
      
    # re: 一個以前沒有注意的問題:java構造函數的執行順序 2012-08-08 10:54 | 王鵬飛
    不錯,很有幫助  回復  更多評論
      
    主站蜘蛛池模板: 666精品国产精品亚洲| 国产一区二区三区在线观看免费| 无码国产精品一区二区免费模式| 精品熟女少妇aⅴ免费久久| selaoban在线视频免费精品| 日韩在线观看免费完整版视频| 羞羞漫画页面免费入口欢迎你| 在线永久免费的视频草莓| 久久久久久毛片免费播放| 国产白丝无码免费视频| 久久青草国产免费观看| 在线美女免费观看网站h| 91精品免费久久久久久久久| 114级毛片免费观看| 国产又黄又爽又猛免费app| 九九九精品成人免费视频| 和日本免费不卡在线v| 日韩免费视频在线观看| 国产男女猛烈无遮挡免费视频| 亚洲AV成人精品日韩一区18p| 自拍偷自拍亚洲精品第1页| 亚洲色成人中文字幕网站| 亚洲AV成人一区二区三区AV| 久久精品亚洲一区二区三区浴池| 亚洲国产精品日韩在线| 亚洲国产日韩a在线播放| 免费在线观看亚洲| 中文永久免费观看网站| 日本免费一区二区三区| 99久久综合国产精品免费| 国产免费人视频在线观看免费| 亚洲乱亚洲乱少妇无码| 国产AV无码专区亚洲精品| 亚洲成人免费在线观看| 亚洲风情亚Aⅴ在线发布| h在线看免费视频网站男男| 在线免费观看国产| 国产男女性潮高清免费网站| 国产精品亚洲片在线观看不卡 | 国产精品99久久免费观看| 国产又大又粗又长免费视频|