有人问我一个关于递归的问题, 测试代码如下:
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 
走走停停又三年 阅读(2387) 
评论(3)  编辑  收藏  所属分类: 
Java Technology