<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,體現(xiàn)對(duì)象初始化流程的代碼:

    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類的構(gòu)造器");
        }

        
    {
            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類的構(gòu)造器");
        }

        
    {
            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 + ")");
        }

    }

    執(zhí)行結(jié)果:
    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類的構(gòu)造器
    Bow(4)
    Test hello1...非static塊1
    Bow(5)
    Test hello2...非static塊2
    Test...Test類的構(gòu)造器


    從上面結(jié)果,可以總結(jié)出JAVA對(duì)象初始化的流程:
     【1】父類static塊和父類static屬性(兩者的執(zhí)行先后順序依據(jù)它們?cè)陬愔芯唧w位置由上至下)
     【2】子類static塊和子類static屬性(兩者的執(zhí)行先后順序依據(jù)它們?cè)陬愔芯唧w位置由上至下)
     【3】執(zhí)行main方法中new關(guān)鍵字之前的代碼塊
     【4】父類非static塊執(zhí)行和父類非static屬性(兩者的執(zhí)行先后順序依據(jù)它們?cè)陬愔芯唧w位置由上至下,如果屬性為實(shí)例類型,則執(zhí)行該實(shí)例所在類的非static塊和非static屬性,再執(zhí)行該類的構(gòu)造器,即[4][5]步驟)
     【5】父類構(gòu)造器(完成非static屬性初始值的設(shè)置) 
     【6】子類非static塊執(zhí)行和子類非static屬性(兩者的執(zhí)行先后順序依據(jù)它們?cè)陬愔芯唧w位置由上至下,如果屬性為實(shí)例類型,則執(zhí)行該實(shí)例所在類的非static塊和非static屬性,再執(zhí)行該類的構(gòu)造器,即[6][7]步驟)
     【7】子類構(gòu)造器(完成非static屬性初始值設(shè)置,如果在子類構(gòu)造器執(zhí)行前就返回該非static屬性,則該非static屬值為屬性默認(rèn)值
       注:針對(duì)第【7】點(diǎn)“子類構(gòu)造器執(zhí)行前就返回該非static屬性”,具體可以見(jiàn)下例:
    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();
        }

    }
    這段代碼的執(zhí)行結(jié)果:
    instance1 value is: 0 因?yàn)閚ew 子類ChildObjectInit時(shí),會(huì)先初始化父類ParentObjectInit,繼而調(diào)用父來(lái)構(gòu)造器器,接著執(zhí)行此構(gòu)造器中的test()方法,基于多態(tài)性,會(huì)轉(zhuǎn)而調(diào)用子類的test()方法執(zhí)行子類test()方法代碼體,打印出instanceValue的屬性默認(rèn)值。(因?yàn)榇藭r(shí)打印instanceValue值后,父類構(gòu)造器才執(zhí)行結(jié)束返回,根本還沒(méi)輪到子類的初始化工作和子類構(gòu)造器的執(zhí)行。)
    posted on 2008-05-24 21:26 cheng 閱讀(2201) 評(píng)論(3)  編輯  收藏 所屬分類: JBS

    FeedBack:
    # re: 對(duì)象初始化流程梳理
    2008-05-25 15:12 | 隔葉黃鶯
    1. 初始化分為為的初始化和實(shí)例的初始化
    2. 每個(gè)類在 JVM 中都對(duì)應(yīng)一個(gè) Class 實(shí)例
    3. 父類實(shí)例是作為子例的部分存在的 (Class 實(shí)例之間也存在父子關(guān)系)
    4. 初始化實(shí)例之前要初始化類

    基于以上幾點(diǎn)就可以理解以下初始化順序
    1. 父類靜態(tài)屬性、靜態(tài)類 (父類的初始化,對(duì)應(yīng) JVM 方法 cinit())
    2. 子類的靜態(tài)屬性、靜態(tài)類 (子類的初始化,對(duì)應(yīng) JVM 方法 cinit())
    3. 父類的實(shí)例構(gòu)造,實(shí)例變量初始化 (實(shí)例變量初始實(shí)際會(huì)放到 JVM 的 init() 中)
    4. 子類的實(shí)例構(gòu)造,實(shí)例變量初始化 (也是對(duì)應(yīng)的 init() 方法)

    關(guān)于類的 Class 實(shí)例,可以回想 Log 的聲明
    Log log = LogFactory.getLog(TestClass.class);
    也就是無(wú)論你,new 多少個(gè) TestClass 實(shí)例,它們對(duì)應(yīng)著同一個(gè) TestClass 的 Class 實(shí)例,也就是為什么很多地方把靜態(tài)方法、靜態(tài)屬性說(shuō)成是類的方法、類的屬性,其實(shí)質(zhì)就是在 JVM 中存在同一個(gè) Class 實(shí)例的方法、屬性,也就能保持一致性。

    關(guān)于父類實(shí)例是作為子類的一部分存在,可借鑒 C++ 或是有面向?qū)ο筇匦缘?C 函數(shù)庫(kù)(如 gtk),來(lái)理解,父類實(shí)例會(huì)居于子類實(shí)例的首地址,所以對(duì)子類轉(zhuǎn)型成父類實(shí)例時(shí),它是安全的,因?yàn)槭椎刂芬粯拥模詮氖椎刂返?size(父類)就是父類實(shí)例地址空間,到size(子類)就是子類實(shí)例的地址空間。  回復(fù)  更多評(píng)論
      
    # re: 對(duì)象初始化流程梳理
    2008-05-26 14:32 | cheng
    看過(guò)樓上朋友見(jiàn)解,體會(huì)又深一層,謝謝。  回復(fù)  更多評(píng)論
      
    # re: 對(duì)象初始化流程梳理
    2008-05-26 14:32 | Happy漫步者
    不錯(cuò) 收藏了  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 国产免费变态视频网址网站| 午夜视频免费在线观看| 噜噜嘿在线视频免费观看| 亚洲日本香蕉视频| 91高清免费国产自产| 亚洲人成在久久综合网站| 日韩亚洲国产高清免费视频| 亚洲欧洲日韩极速播放 | 亚洲色成人网站WWW永久四虎 | 亚洲国产综合久久天堂| 七次郎成人免费线路视频| 亚洲最大激情中文字幕| 久久精品私人影院免费看| 激情内射亚洲一区二区三区| 三年片在线观看免费大全| 亚洲a∨无码一区二区| 亚洲人成人无码网www国产| 十八禁在线观看视频播放免费| 亚洲AV日韩AV永久无码免下载| 免费看污成人午夜网站| 亚洲AV永久无码精品一福利 | 巨波霸乳在线永久免费视频 | 麻豆69堂免费视频| 久久精品国产亚洲网站| 2021免费日韩视频网| 国产成人va亚洲电影| 日本红怡院亚洲红怡院最新| 在线a免费观看最新网站| 亚洲精品无码久久久久YW| 国产亚洲人成A在线V网站| 99久久99热精品免费观看国产| 亚洲国产成人手机在线观看| 亚洲精品制服丝袜四区| 猫咪社区免费资源在线观看| 视频一区在线免费观看| 亚洲综合精品一二三区在线| 精品国产免费一区二区| 日本一道本不卡免费 | 免费在线观看视频网站| 黄页免费视频播放在线播放| 久久久亚洲精品视频|