posts - 42,comments - 83,trackbacks - 0
        有人问我一个关于递归的问题, 测试代码如下:

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 走走停停又三年 阅读(2350) 评论(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
递归有没在详细的解释呢  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: