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