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

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

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

    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 保爾任 閱讀(157) 評論(0)  編輯  收藏

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


    網站導航:
     

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

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 黄页网站在线观看免费| 激情综合亚洲色婷婷五月APP| 国产AV无码专区亚洲AV蜜芽| 18国产精品白浆在线观看免费| 久久亚洲AV成人无码软件| 久久久久久夜精品精品免费啦| 亚洲黄页网在线观看| 成人福利免费视频| 亚洲另类自拍丝袜第1页| 日韩视频在线精品视频免费观看| 亚洲人成人77777在线播放| 日韩吃奶摸下AA片免费观看| 亚洲不卡1卡2卡三卡2021麻豆| 免费A级毛片无码无遮挡内射| 国产精品亚洲综合五月天| 成在人线AV无码免费| 亚洲人成无码网WWW| 乱淫片免费影院观看| 99无码人妻一区二区三区免费| 亚洲国产精品yw在线观看| 成年女人毛片免费视频| 亚洲欧美在线x视频| 亚洲午夜福利精品久久| 国产高清不卡免费视频| 亚洲电影在线播放| 永久免费毛片手机版在线看| 最好2018中文免费视频| 亚洲不卡av不卡一区二区| 日本免费人成在线网站| 亚洲成av人在线观看网站| 亚洲精品无码99在线观看 | 亚洲男女性高爱潮网站| 免费A级毛片无码免费视| 国产亚洲福利一区二区免费看| 久久亚洲2019中文字幕| 美国毛片亚洲社区在线观看| 亚洲欧洲中文日韩av乱码| 少妇太爽了在线观看免费视频 | 免费观看午夜在线欧差毛片 | 免费无码黄网站在线看| ass亚洲**毛茸茸pics|