有人問我一個(gè)關(guān)于遞歸的問題, 測試代碼如下:
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一個(gè)TestClass對(duì)象,然后調(diào)用testClass.printOne(),結(jié)果是什么? 會(huì)不會(huì)造成遞歸調(diào)用?
當(dāng)然不會(huì),因?yàn)榇a中的所謂的遞歸都是在static域中的,而static域中的內(nèi)容只是在這個(gè)類裝載的時(shí)候調(diào)用,也就是說它的調(diào)用在constructor之前完成,而且在整個(gè)JVM運(yùn)行期間,static域中的內(nèi)容只會(huì)被執(zhí)行一次。當(dāng)然如果這個(gè)類在運(yùn)行期間被GC從PermGen中unload的話,下次該類被裝載的時(shí)候,static域中的內(nèi)容將被重新調(diào)用。
大家可以想想上面的測試輸出結(jié)果是什么,不要看下面的答案哦
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!
關(guān)于static域是在裝載期間還是在對(duì)象初始化期間被執(zhí)行,我們可以通過下面的代碼測試:
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 }
我們可以找個(gè)jsp,在其中加上如下內(nèi)容:
1 try
2 {
3 Class.forName("LoaderTest");
4 }catch(ClassNotFoundException e)
5 {
6 }
好了,上面代碼中我們并沒有去實(shí)例化LoaderTest對(duì)象,而只是動(dòng)態(tài)裝載這個(gè)類,static的內(nèi)容就被輸出了。
posted on 2008-09-26 12:38
走走停停又三年 閱讀(2361)
評(píng)論(3) 編輯 收藏 所屬分類:
Java Technology