Picses' sky

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

          也談一個對象初始化細節

          Posted on 2007-12-20 10:46 Matthew Chen 閱讀(1085) 評論(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,即加載后就初始化。
          主站蜘蛛池模板: 宜都市| 清水河县| 新巴尔虎右旗| 彰武县| 桃园市| 新郑市| 察哈| 天长市| 定西市| 海盐县| 仁化县| 文山县| 漠河县| 连山| 油尖旺区| 涿鹿县| 应用必备| 莫力| 万山特区| 泸定县| 东兰县| 汤阴县| 当涂县| 饶河县| 会泽县| 绍兴市| 巴塘县| 巴彦县| 林芝县| 浑源县| 汉寿县| 安远县| 邻水| 天津市| 麻城市| 乌兰县| 涿州市| 平潭县| 宿松县| 嫩江县| 巴彦县|