千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          <2007年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          盡管千里冰封
          依然擁有晴空

           

          留言簿(204)

          隨筆分類(197)

          隨筆檔案(189)

          文章檔案(2)

          友情鏈接

          搜索

          •  

          積分與排名

          • 積分 - 964341
          • 排名 - 35

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          記得在剛學JAVA的時候,類的加載機制和初始化順序經常被弄的糊里糊涂,其實當我們不太了解某些事情的時候,不防去做一做實驗,讓代碼的運行結果說話,這或許能幫助我們更好地了解一些事情.今天我們就用一些代碼來看一下類是如何被加載的,并且當有繼承關系的時候,類的加載順序又是怎么樣的.

          先看代碼吧

          /*
           * Test4.java
           * 
           * Created on 2007-9-21, 9:33:31
           * 
           * To change this template, choose Tools | Templates
           * and open the template in the editor.
           
          */

          package test1;

          /**
           *
           * 
          @author hadeslee
           
          */
          public class Test4 {
              
          private void testClassForName(String name) throws ClassNotFoundException{
                  Class c
          =Class.forName(name);
              }
              
          private void testNewInstance(String name) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
                  Class c
          =Class.forName(name);
                  Object obj
          =c.newInstance();
                  System.out.println(obj);
              }
              
          public static void main(String[] args)throws Exception {
                  Test4 t
          =new Test4();
                  t.testClassForName(
          "test1.B");
                  
          new B();
                  
          new B();
              }
          }
          class A{
              
          private int aj;
              {
                  aj
          =20;
                  System.out.println(
          "A成員初始化塊");
              }
              
          private static int ai;
              
          static {
                  ai
          =10;
                  System.out.println(
          "A靜態初始化塊");
              }
              
          public A(){
                  System.out.println(
          "A構造函數");
              }
          }
          class B extends A{
              
          private static int bi;
              
          static {
                  bi
          =30;
                  System.out.println(
          "B靜態初始化塊");
              }
              
          private  int bj;
              {
                  bj
          =40;
                  System.out.println(
          "B成員初始化塊");
              }
              
          public B(){
                  System.out.println(
          "B構造函數");
              }
          }

          在代碼里面我們總共有三個類,一個是做測試用的Test4,一個是A,一個是A的子類B,我們在A和B類里面都有很多輸出,一個是靜態初始化的輸出,一個是成員初始化的輸出,一個是在構造函數里面的輸出,從這些輸出我們可以知道代碼的執行順序,以上代碼運行輸出如下:

          A靜態初始化塊
          B靜態初始化塊
          A成員初始化塊
          A構造函數
          B成員初始化塊
          B構造函數
          A成員初始化塊
          A構造函數
          B成員初始化塊
          B構造函數


          從上面我們可以看出,A和B的靜態初始化塊只被執行了一次,也就是類的對象將要被生成的時候,它會執行,并且執行的順序如下:父類的靜態成員,子類的靜態成員,父類的成員變量和構造方法,子類的成員變量和構造方法.當再用這個類生成對象的時候,靜態的部份就不再被調用了.因為靜態是類的所有實例所共享的,所以它在整個虛擬機的生命周期內只執行一次.

          如果我們加上一個t.testClassForName("test1.B");放在main函數的最后面,我們會發現輸出還是和剛剛一樣,沒有任何改變,這個時候,我們知道,當我們調用Class.forName(name);的時候,類是不會自動初始化的,它默認只是把這個類的字節碼讀入內存,但是并沒有初始化這個類.只有我們調用了newInstance()的時候,它才會被初始化.在這里我們再這樣試一下:把A和B生成的class文件去掉,然后再分別調用Class.forName和new B(),看看會怎么樣,我們會發現當我們調用Class.forName的時候,當我們要for的Name找不到的時候,只會拋出ClassNotFoundException,注意,它只是一個異常而已,而當我們new B()的時候,B的class文件卻被我們刪掉了,那就事大了,那就將拋出NoClassDefFoundError,呵呵,它就是一個Error了,這點區別我們可要注意啦,當我們在做這些事情的時候,一個只要捕獲異常就可以了,一個卻需要捕獲一個Error,一般來說,Error級別的錯誤是不希望程序員去捕獲的.了解了類的基本加載順序以及加載機制后,對我們了解JAVA是有一定的幫助的.好了,先講這些吧,有關類的加載機制以后再繼續分享:)


          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2007-09-21 09:59 千里冰封 閱讀(1677) 評論(2)  編輯  收藏 所屬分類: JAVASE

          FeedBack:
          # re: 類加載機制初探
          2007-09-21 13:34 | 久城
          哈哈,讓我想起三個月前,我的畢業設計就是這個...  回復  更多評論
            
          # re: 類加載機制初探
          2008-01-25 00:24 | damagegod
          畢業設計寫這個?  回復  更多評論
            
          主站蜘蛛池模板: 商南县| 屏边| 治多县| 类乌齐县| 黔南| 文化| 广州市| 龙胜| 鲁山县| 六枝特区| 永吉县| 玉溪市| 余庆县| 桃园市| 买车| 游戏| 罗城| 盐边县| 简阳市| 紫金县| 涡阳县| 保靖县| 泸定县| 开封县| 淮北市| 乾安县| 花莲县| 蓝山县| 河西区| 京山县| 清徐县| 宜都市| 孟津县| 会泽县| 东海县| 红原县| 盐池县| 安平县| 泗水县| 保山市| 类乌齐县|