posts - 73,  comments - 55,  trackbacks - 0
          初始化(initialization)其實包含兩部分:
          1.類的初始化(initialization class & interface)
          2.對象的創建(creation of new class instances)。
          因為類的初始化其實是類加載(loading of classes)的最后一步,所以很多書中把它歸結為“對象的創建”的第一步。其實只是看問題的角度不同而已。為了更清楚的理解,這里還是分開來。
          順序:
          應為類的加載肯定是第一步的,所以類的初始化在前。大體的初始化順序是:
          類初始化 -> 子類構造函數 -> 父類構造函數 -> 實例化成員變量 -> 繼續執行子類構造函數的語句
          下面結合例子,具體解釋一下。
          1。類的初始化(Initialization classes and interfaces),其實很簡單,具體來說有:
          (a)初始化類(initialization of class),是指初始化static field 和執行static初始化塊。
          例如:
          class Super {
          ??????? static String s = “initialization static field”; //初始化static field,其中“= “initialization static field” ”又叫做static field initializer
          ??????? // static初始化塊,又叫做static initializer,或 static initialization block
          ??????? static {
          ??????? System.out.println(“This is static initializer”);
          }
          }
          btw,有些書上提到static initializer 和 static field initializer 的概念,與之對應的還有 instance initializer 和 instance variable initializer。例子中的注釋已經解釋了其含義。
          (b)初始化接口(initialization of interface),是指初始化定義在該interface中的field。
          *注意*
          --initialization classes 時,該class的superclass 將首先被初始化,但其實現的interface則不會被初始化。
          --initialization classes 時,該class的superclass,以及superlcass的superclass 會首先被遞歸地初始化,從java.lang.Object一直到該class為止。但initialiazation interface的時候,卻不需如此,只會初始化該interface本身。
          --對于由引用類變量(class field)所引發的初始化,只會初始化真正定義該field的class。
          --如果一個static field是編譯時常量(compile-time constant)(即定義為static final field),則對它的引用不會引起定義它的類的初始化。
          為了幫助理解最后兩點,請試試看下面的例子:
          public class Initialization {
          ???????
          ??????? public static void main(String[] args) {
          ???????????????
          ??????????????? System.out.println(Sub.x); // Won't cause initialization of Sub, because x is declared by Super, not Sub.
          ???????????????????????????????????????? // 不會引起Sub類的初始化,因為x是定義在Super類中的
          ??????????????? System.out.println("-------------------------");
          ??????????????? System.out.println(Sub.y); // Won't cause initialization of Sub, because y is constant.
          ???????????????????????????????????????? // 不會引起Sub類的初始化,因為y是常量
          ??????????????? System.out.println("-------------------------");
          ??????????????? System.out.println(Sub.z = 2004); // Will cause initialization of Sub class
          ??// 將會引起Sub的初始化
          ??}
          }
          class Super{
          ??????? static int x = 2006;
          }
          class Sub extends Super {
          ???????
          ??????? static final int y = 2005;
          ???????
          static int z;
          ???????
          static {
          ??????????????? System.out.println("Initialization Sub");
          ??????? }
          }
          2。對象的創建(creation of new class instances),稍微有點煩瑣,具體的步驟如下
          (a) 所有的成員變量—包括該類,及它的父類中的成員變量--被分配內存空間,并賦予默認值。(Btw,這里是第一次初始化成員變量)
          (b) 為所調用的構造函數初始化其參數變量。(如果有參數)
          (c) 如果在構造函數中用this 調用了同類中的其他構造函數,則按照步驟(b)~(f)去處理被調用到的構造函數。
          (d) 如果在構造函數中用super調用了其父類的構造函數,則按照步驟(b)~(f)去處理被調用到的父類構造函數。
          (e) 按照書寫順序,執行instance initializer 和 instance variable initializer來初始化成員變量。(Btw,這里是第二次初始化成員變量)
          (f) 按照書寫順序,執行constructor的其余部分。
          *注意*
          成員變量其實都被初始化2次,第一次是賦予默認值,第二次才是你想要設定的值。
          最后看一個例子:
          public class InitializationOrder {
          ??????? public static void main(String[] args) {
          ??????????????? Subclass sb = new Subclass();
          ??????? }
          }
          class Super{
          ???????
          ??????? static {
          ??????????????? System.out.println(1);
          ??????? }
          ???????
          ??????? Super(int i){
          ??????????????? System.out.println(i);
          ??????? }
          }
          class Subclass extends Super implements Interface{
          ???????
          ??????? static {
          ??????????????? System.out.println(2);
          ??????? }???????
          ???????
          ??????? Super su = new Super(4);
          ???????
          ??????? Subclass() {
          ??????????????? super(3);
          ??????????????? new Super(5);
          ??????? }
          }
          interface Interface{
          ??????? static Super su = new Super(0);
          }
          稍微解釋一下:
          首先,Java虛擬機要執行InitializationOrder類中的static 方法main(),這引起了類的初始化。開始初始化InitializationOrder類。具體的步驟略去不說。
          接著,InitializationOrder類初始化完畢后,開始執行main()方法。語句Subclass sb = new Subclass()將創建一個Subclass對象。加載類Subclass后對其進行類初始化,但因為Subclass有一個父類Super,所以先初始化Super類,初始化塊static {System.out.println(1);}被執行,打印輸出1;
          第三,Super初始化完畢后,開始初始化Subclass類。static {System.out.println(2);}被執行,打印輸出2;
          第四,至此,類的加載工作全部完成。開始進入創建Subclass的對象過程。先為Subclass類和其父類Super類分配內存空間,這時Super su 被附值為null;
          第五,執行構造函數Subclass()時,super(3)被執行。如前面(d)所說,Super類的構造函數Super(int i){….}被調用,并按照步驟(b)~(f)來處理。因此,遞歸調用Super類的父類Object類的構造函數,并按照步驟(b)~(f)來初始化Object類,不過沒有任何輸入結果。最后打印輸出3;
          第六,如前面(e)所說,初始化成員變量su,其結果是打印輸出4;
          第七,如前面(f)所說,執行new Super(5),并打印輸出5;
          最后,Subclass雖然實現了接口Interface,但是初始化它的時候并不會引起接口的初始化,所以接口Interface中的static Super su = new Super(0)自始至終都沒有被執行到。
          max做的小改動:
          public class Test {
          ??? public static void main(String[] args) {
          ??????????? Subclass sb = new Subclass();
          ??? }
          }
          class SS{
          ?public SS(int i){
          ??System.out.println(i);
          ?}
          }
          class Super{
          ???
          ??? static {
          ??????????? System.out.println(1);
          ??? }
          ??? SS ss = new SS(100);
          ???
          ??? Super(int i){
          ??????????? System.out.println(i);
          ??? }
          }
          class Subclass extends Super implements Interface{
          ???
          ??? static {
          ??????????? System.out.println(2);
          ??? }???????
          ???
          ??? Super su = new Super(4);
          ???
          ??? Subclass() {
          ??????????? super(3);
          ??????????? new Super(5);
          ??? }
          }
          interface Interface{
          ??? static Super su = new Super(0);
          }
          --------------------
          結果為:
          1
          2
          100
          3
          100
          4
          100
          5
          posted on 2006-06-01 14:56 保爾任 閱讀(158) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 梁山县| 资兴市| 文安县| 赣州市| 乐陵市| 文山县| 浪卡子县| 林西县| 正镶白旗| 杨浦区| 定南县| 竹北市| 威海市| 深水埗区| 涞水县| 尚义县| 凤台县| 陇南市| 保靖县| 南宫市| 成都市| 青冈县| 浦北县| 洱源县| 宝坻区| 太和县| 班戈县| 玛曲县| 怀仁县| 安丘市| 金乡县| 全州县| 平远县| 彭水| 博湖县| 页游| 河曲县| 稷山县| 岑巩县| 东源县| 安国市|