关于Java中的递归调用

关于Java中的递归调用
        有人问我一个关于递归的问题, 测试代码如下:

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的内容就被输出了。

你可能感兴趣的:(关于Java中的递归调用)