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

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

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

    posts - 188,comments - 176,trackbacks - 0


    類Person和子類Son,體現對象初始化流程的代碼:

    public class Person {
        Bow b1 
    = new Bow(1);
        
    static {
            System.out.println(
    "Person staticstatic塊1");
        }

        
    {
            System.out.println(
    "Person hello非static塊1");
        }

        Bow b2 
    = new Bow(2);
        
    static Bow b3 = new Bow(3);
        Person() 
    {
            System.out.println(
    "PersonPerson類的構造器");
        }

        
    {
            System.out.println(
    "Person hello非static塊2");
        }

        
    static {
            System.out.println(
    "Person staticstatic塊2");
        }

    }

    class Son extends Person {
        Bow b4 
    = new Bow(4);
        
    static {
            System.out.println(
    "Test staticstatic塊1");
        }

        
    {
            System.out.println(
    "Test hello1非static塊1");
        }

        Bow b5 
    = new Bow(5);
        
    static Bow b6 = new Bow(6);
        Son() 
    {
            System.out.println(
    "TestTest類的構造器");
        }

        
    {
            System.out.println(
    "Test hello2非static塊2");
        }

        
    static {
            System.out.println(
    "Test static2static塊2");
        }

        
    public static void main(String[] args) {
            System.out.println(
    "main");
            
    new Son();
        }

    }

    class Bow {
        Bow(
    int m) {
            System.out.println(
    "Bow(" + m + ")");
        }

    }

    執行結果:
    Person static...static塊1
    Bow(3)
    Person static...static塊2
    Test static...static塊1
    Bow(6)
    Test static2...static塊2
    main...
    Bow(1)
    Person hello...非static塊1
    Bow(2)
    Person hello...非static塊2
    Person...Person類的構造器
    Bow(4)
    Test hello1...非static塊1
    Bow(5)
    Test hello2...非static塊2
    Test...Test類的構造器


    從上面結果,可以總結出JAVA對象初始化的流程:
     【1】父類static塊和父類static屬性(兩者的執行先后順序依據它們在類中具體位置由上至下)
     【2】子類static塊和子類static屬性(兩者的執行先后順序依據它們在類中具體位置由上至下)
     【3】執行main方法中new關鍵字之前的代碼塊
     【4】父類非static塊執行和父類非static屬性(兩者的執行先后順序依據它們在類中具體位置由上至下,如果屬性為實例類型,則執行該實例所在類的非static塊和非static屬性,再執行該類的構造器,即[4][5]步驟)
     【5】父類構造器(完成非static屬性初始值的設置) 
     【6】子類非static塊執行和子類非static屬性(兩者的執行先后順序依據它們在類中具體位置由上至下,如果屬性為實例類型,則執行該實例所在類的非static塊和非static屬性,再執行該類的構造器,即[6][7]步驟)
     【7】子類構造器(完成非static屬性初始值設置,如果在子類構造器執行前就返回該非static屬性,則該非static屬值為屬性默認值
       注:針對第【7】點“子類構造器執行前就返回該非static屬性”,具體可以見下例:
    public class ParentObjectInit {

        
    public void test() {

        }

        
    public ParentObjectInit() {
            test();
        }

    }

    class ChildObjectInit extends ParentObjectInit {
        
    private int instanceValue = 20;
        
    public void test() {
            System.out.println(
    "instance1 value : " + instanceValue);
        }

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

    }
    這段代碼的執行結果:
    instance1 value is: 0 因為new 子類ChildObjectInit時,會先初始化父類ParentObjectInit,繼而調用父來構造器器,接著執行此構造器中的test()方法,基于多態性,會轉而調用子類的test()方法執行子類test()方法代碼體,打印出instanceValue的屬性默認值。(因為此時打印instanceValue值后,父類構造器才執行結束返回,根本還沒輪到子類的初始化工作和子類構造器的執行。)
    posted on 2008-05-24 21:26 cheng 閱讀(2203) 評論(3)  編輯  收藏 所屬分類: JBS

    FeedBack:
    # re: 對象初始化流程梳理
    2008-05-25 15:12 | 隔葉黃鶯
    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: 對象初始化流程梳理
    2008-05-26 14:32 | cheng
    看過樓上朋友見解,體會又深一層,謝謝。  回復  更多評論
      
    # re: 對象初始化流程梳理
    2008-05-26 14:32 | Happy漫步者
    不錯 收藏了  回復  更多評論
      
    主站蜘蛛池模板: 久久国产美女免费观看精品| 亚洲Av无码乱码在线播放| 一区二区三区视频免费观看| 亚洲六月丁香六月婷婷色伊人| 亚洲一级特黄无码片| 永久免费观看的毛片的网站| 69视频在线是免费观看| 中文字幕免费视频精品一| 亚洲aⅴ天堂av天堂无码麻豆| 亚洲精品视频在线免费| 久久亚洲国产中v天仙www| 亚洲成年看片在线观看| 手机在线毛片免费播放| 国产a视频精品免费观看| 无码人妻一区二区三区免费n鬼沢| 人人爽人人爽人人片av免费| 亚洲人成网站在线在线观看| 亚洲另类古典武侠| 亚洲日本在线观看网址| 精品日韩亚洲AV无码一区二区三区| 亚洲熟女一区二区三区| 色噜噜AV亚洲色一区二区| 亚洲伊人久久成综合人影院| 亚洲 无码 在线 专区| 国产一级一片免费播放i| 日韩一级视频免费观看| 精品少妇人妻AV免费久久洗澡| 无码视频免费一区二三区| 免费a级毛片高清视频不卡| 男女免费观看在线爽爽爽视频| 亚洲视频免费一区| 黄色网址免费大全| 国产精品69白浆在线观看免费 | 日本一道综合久久aⅴ免费| 毛片a级三毛片免费播放| 天天拍拍天天爽免费视频| 女人张腿给男人桶视频免费版| 成人免费毛片视频| 免费亚洲视频在线观看| 免费A级毛片无码A∨男男| 亚洲色偷拍区另类无码专区|