posts - 42,comments - 83,trackbacks - 0
          <2013年8月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          本Blog文章為fjin原創,轉載請注明出處及作者. MSN: jinfh77@hotmail.com

          常用鏈接

          留言簿(16)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

                  有人問我一個關于遞歸的問題, 測試代碼如下:

          TestClass.java
           1 public class TestClass {
           2     
           3     private static TestPrinter printer = null;
           4     
           5     static
           6     {
           7         printStaticInfo("initialize test printer in static");
           8         printer = new TestPrinter();
           9     }
          10     
          11     public TestClass()
          12     {
          13         System.out.println("to construct a TestClass object");
          14     }
          15     
          16     public void printOne()
          17     {
          18         printer.printOne();
          19     }
          20     
          21     public static void printStaticInfo(String s)
          22     {
          23         System.out.println(s);
          24     }
          25 }

          TestPrinter.java
           1 public class TestPrinter {
           2 
           3     private static TestClass tc = null;
           4     
           5       static
           6       {
           7           printStaticInfo("initialize test class in static");
           8           tc = new TestClass();
           9       }
          10 
          11     public TestPrinter()
          12     {
          13         System.out.println("to construct a TestPrinter object");
          14     }
          15           
          16     public void printOne()
          17     {
          18         System.out.println("One");
          19         System.out.println("compile again!");
          20     }
          21     
          22     public static void printStaticInfo(String s)
          23     {
          24         System.out.println(s);
          25     }
          26 }


               他的問題是:如果我new一個TestClass對象,然后調用testClass.printOne(),結果是什么? 會不會造成遞歸調用?

              當然不會,因為代碼中的所謂的遞歸都是在static域中的,而static域中的內容只是在這個類裝載的時候調用,也就是說它的調用在constructor之前完成,而且在整個JVM運行期間,static域中的內容只會被執行一次。當然如果這個類在運行期間被GC從PermGen中unload的話,下次該類被裝載的時候,static域中的內容將被重新調用。

               大家可以想想上面的測試輸出結果是什么,不要看下面的答案哦

          initialize test printer in static
          initialize test class in static
          to construct a TestClass object
          to construct a TestPrinter object
          to construct a TestClass object
          One
          compile again!

                  關于static域是在裝載期間還是在對象初始化期間被執行,我們可以通過下面的代碼測試:

           1 public class LoaderTest {
           2     
           3     //to evaluate follow codes is invoked during class loading or object initialized
           4     //class laoding: Class.forName();
           5     //object initialized: Object obj = new ClassName();
           6     static
           7     {
           8         int i = 0;
           9         System.out.println("i is initialized in static during class loading");
          10     }
          11 }

                  我們可以找個jsp,在其中加上如下內容:
          1   try
          2   {
          3         Class.forName("LoaderTest");
          4   }catch(ClassNotFoundException e)
          5   {
          6   }
              
                  好了,上面代碼中我們并沒有去實例化LoaderTest對象,而只是動態裝載這個類,static的內容就被輸出了。
          posted on 2008-09-26 12:38 走走停停又三年 閱讀(2364) 評論(3)  編輯  收藏 所屬分類: Java Technology

          FeedBack:
          # re: 關于Java中的遞歸調用
          2008-09-27 10:44 | YYX
          static塊可以說是Class對象的構造函數  回復  更多評論
            
          # re: 關于Java中的遞歸調用
          2008-09-28 15:26 | zhuxing
          關于初始化有兩個概念:類型初始化和實例初始化^_^  回復  更多評論
            
          # re: 關于Java中的遞歸調用
          2013-08-14 22:38 | maco
          遞歸有沒在詳細的解釋呢  回復  更多評論
            
          主站蜘蛛池模板: 磐安县| 闽侯县| 尼勒克县| 边坝县| 枞阳县| 巴塘县| 龙山县| 连平县| 安乡县| 洛扎县| 南投县| 大田县| 洪江市| 高邮市| 樟树市| 五河县| 赤城县| 永州市| 阳江市| 阳谷县| 柳州市| 乌兰浩特市| 广水市| 宁波市| 滕州市| 海淀区| 瓮安县| 泰州市| 中方县| 黔南| 永城市| 永清县| 石门县| 桑日县| 洛浦县| 芮城县| 滁州市| 义乌市| 嘉善县| 松溪县| 定襄县|