Picses' sky

          Picses' sky
          posts - 43, comments - 29, trackbacks - 0, articles - 24

          也談一個對象初始化細節

          Posted on 2007-12-20 10:46 Matthew Chen 閱讀(1089) 評論(1)  編輯  收藏 所屬分類: Java SE
          網上這類的文章多了,也就歸納了一下:

          初始化按串行順序如下:

          ……
          超類靜態成員變量
          超類靜態塊
          子類靜態成員變量
          子類靜態塊
          ……

          ……
          超類成員變量分配引用并默認初始化
          子類成員變量分配引用并默認初始化
          ……
          ……
          超類成員變量用顯式初始化值賦值
          超類構造器
          子類成員變量用顯式初始化值賦值
          子類構造器
          ……
          ……


          另外,這樣的初始化順序中,如果子類繼承了超類的a方法并在其中修改了子類自己的成員變量,而a方法在超類的構造函數中被調用,那么這個修改的值將被“子類成員變量用顯式初始化值賦值”這一過程重新覆蓋而導致修改失效。

          我是這樣理解的,大家給點意見。


          Feedback

          # re: 也談一個對象初始化細節  回復  更多評論   

          2007-12-20 14:53 by 隔葉黃鶯
          記住以下兩點就好理解了

          類的成員先于實例成員初始化
          父類實例與子類實例的關系可以理解為 Is-A 的關系

          所以子類實例初始化之前必須先有父類的實例

          其實還應該區分類的初始化和實例了初始化,反應到字節碼操作指令中是
          類的初始化方法是 <clinit>()
          實例的初始化方法是 <init>()

          任何一個類的初媽化都要求它的所有祖先類(而不是祖先接口)預先被初始化。而一個接口的初始化,并不要求它的祖先接口預先被初始化。

          類有主動初始化和被動初始化,如new和使用靜態字段,還有我們一定用過 Class.forName() 方法,它還有一個重載方法 forName(String name, boolean initialize, ClassLoader loader),一個參數的forName,默認的initialize 是 true,即加載后就初始化。
          主站蜘蛛池模板: 台东市| 乌兰浩特市| 五家渠市| 华宁县| 晋州市| 赞皇县| 兰州市| 保靖县| 永泰县| 黔东| 乐清市| 咸宁市| 温泉县| 通榆县| 浮梁县| 长顺县| 雷山县| 收藏| 平凉市| 府谷县| 淳化县| 乐至县| 潞西市| 通江县| 南召县| 金山区| 西吉县| 射洪县| 海盐县| 闸北区| 黑山县| 尉犁县| 苍山县| 德令哈市| 元氏县| 内黄县| 施甸县| 保德县| 黑龙江省| 波密县| 体育|