ゞ沉默是金ゞ

          魚離不開水,但是沒有說不離開哪滴水.
          posts - 98,comments - 104,trackbacks - 0

          class ClassA{
              
          static{
                  System.out.println(
          "ClassA's static.");
              }

              
          public ClassA(){
                  System.out.println(
          "ClassA's constructor.");
              }

          }

          class ClassB extends ClassA{
              
          static{
                  System.out.println(
          "ClassB's static.");
              }

              
          public ClassB(){
                  System.out.println(
          "ClassB's constructor.");
              }

          }

          public class TestClass {

              
          public static void main(String[] args) {
                  ClassA a 
          = new ClassB();
                  System.out.println(
          "===============");
                  a 
          = new ClassB();
              }


          }

          輸出:
          ClassA's static.
          ClassB's static.
          ClassA's constructor.
          ClassB's constructor.
          ===============
          ClassA
          's constructor.
          ClassB's constructor.
          我個(gè)人分析如下:
          當(dāng)執(zhí)行到ClassA a = new ClassB();時(shí)開始加載ClassB,這里因?yàn)镃lassB繼承ClassA,所以加載ClassA,在加載ClassA的時(shí)候執(zhí)行輸出:ClassA's static.。
          ClassA加載完后,加載ClassB,這時(shí)執(zhí)行結(jié)果為:ClassB's static.。兩個(gè)類都加載完后開始構(gòu)建對(duì)象。
          在構(gòu)建ClassB對(duì)象時(shí),得先構(gòu)建父類對(duì)象ClassA,所以執(zhí)行分別為:ClassA's constructor.
          ClassB's constructor.那么這句話完了。
           
          到a=new ClassB();時(shí),由于ClassA,ClassB已經(jīng)被加載過,在內(nèi)存中。所以只是簡(jiǎn)單的進(jìn)行構(gòu)建對(duì)象。輸出:ClassA's constructor.
          ClassB's constructor.
          希望大家多多指教。(來源于網(wǎng)絡(luò))
          posted on 2009-03-30 09:59 ゞ沉默是金ゞ 閱讀(1267) 評(píng)論(4)  編輯  收藏 所屬分類: Java SE

          FeedBack:
          # re: 類的 初始化順序[未登錄]
          2009-03-30 11:17 | kimi
          類的初始化分為類加載后的初始化和類實(shí)例化后的初始化,當(dāng)new一個(gè)類的時(shí)候,如果此類沒有被加載到vm中,vm會(huì)先加載此類,當(dāng)加載完成后vm會(huì)立即執(zhí)行此類中的所有的靜態(tài)初始化代碼。加載完成后,vm會(huì)為實(shí)例分配內(nèi)存,然后執(zhí)行實(shí)例初始化代碼,最后是執(zhí)行構(gòu)造方法返回新建對(duì)象的引用。

          靜態(tài)初始化代碼是被static修飾的字段或靜態(tài)代碼段,實(shí)例初始化代碼是類中聲明并初始化并且沒有被static修飾的字段,還有就是在類中被大括號(hào)括起來的代碼段  回復(fù)  更多評(píng)論
            
          # re: 類的 初始化順序
          2009-03-30 12:49 | 隔葉黃鶯
          關(guān)鍵是要把握幾點(diǎn)

          1. 對(duì)象實(shí)例初始化之前要初始化類實(shí)例,它們對(duì)應(yīng)字節(jié)碼的方法名分別是 cinit() 和init(),類的靜態(tài)塊編譯后會(huì)放在 cinit() 方法中,{} 括起來的非靜態(tài)塊會(huì)放到 init() 方法中。

          2. 構(gòu)造子對(duì)象實(shí)例前必須構(gòu)造出父對(duì)象實(shí)例,當(dāng)然在構(gòu)造子類實(shí)例前必須構(gòu)造父類實(shí)例。

          就這么兩點(diǎn),這里用了類實(shí)例和對(duì)象實(shí)例。區(qū)別是,比如有個(gè)類A,分別構(gòu)造了
          A a1 = new A();
          A a2 = new A();
          A a3 = new A();

          三個(gè)是對(duì)象實(shí)例,但是只要同一個(gè)類加載器加載的,那么
          a1.getClass()和a2.getClass(),a3.getClass() 就是同一個(gè)實(shí)例,叫做它們的類實(shí)例。

          這里只簡(jiǎn)單的說了是由同一個(gè)類加載器加的,如果延展開來就會(huì)比較復(fù)雜。根據(jù)類加載器的委托機(jī)制和可見性原則還會(huì)有不同的情況。  回復(fù)  更多評(píng)論
            
          # re: 類的 初始化順序[未登錄]
          2009-03-30 13:02 | 新手上路
          @隔葉黃鶯
          這個(gè)沒有看懂。。。。  回復(fù)  更多評(píng)論
            
          # re: 類的 初始化順序
          2009-03-30 14:06 | ゞ沉默是金ゞ
          @kimi
          @隔葉黃鶯
          謝謝關(guān)注...  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 灯塔市| 岳普湖县| 毕节市| 昌平区| 孟村| 海阳市| 乾安县| 托里县| 革吉县| 满洲里市| 南充市| 华坪县| 永平县| 鄂托克前旗| 灌阳县| 六枝特区| 蓬溪县| 泰和县| 南昌县| 九江市| 商都县| 襄汾县| 梁河县| 滕州市| 尚义县| 河池市| 辽源市| 库尔勒市| 景泰县| 荆州市| 华池县| 五常市| 蒲江县| 西贡区| 海丰县| 巴塘县| 山阳县| 台南县| 股票| 抚松县| 和顺县|