比如:class Test
{
   public void fun()
   {
      Test s=new Test();//这句为什么不会引起无限递归?
      System.out.println("test!");
   }
}就是创建一个Test对象时,会创建fun()然后再创建Test对象……无限循环下去,如果方法是static比较容易理解,因为static方法是类创建类时创建,所以创建对象时不会引起递归,但非static方法为什么也不会引起递归?

解决方案 »

  1.   

    执行fun才会创建创建完又不会立马又执行fun 你要手动执行fun
      

  2.   

    那句不是只会分配空间,做些初始化,然后new会返回一个地址给t而已吗?为什么会无限递归?
      

  3.   

    类是图纸,实例化就是按图纸“划拨土地”。
    当你 Test a = new Test(); 时,a 得到了一块属于自己的土地;
    接着,当你 a.fun();时, a.fun()的局部变量s 拿到了一块地,但是s并没有再 s.fun(),怎么会递归呢?
      

  4.   

    fun方法要显示调用才会执行,你通过new实例化类,又不会自动调用fun方法。
    除非你把fun方法放到构造函数中,但会抛出异常。
    public class Test { /**
     * @param args
     */
    public static void main(String[] args) {
    T1 t1 = new T1();
    }}class T1{
    public T1(){
    this.fun();
    }

    public void fun(){
    T1 t1 = new T1();
    System.out.println("fun");
    }
    }
      

  5.   

    这个fun方法不会自动执行啊,怎么会递归呢.
      

  6.   

    class Test{
       public Test() {
            Test t = new Test();
            System.out.println(t);
       }
    }
    //试一下这个;
      

  7.   

    这段才是真正会无限递归的代码,跑了下,堆栈溢出了:)
    Exception in thread "main" java.lang.StackOverflowError
      

  8.   

    首先程序执行的过程中,会被LOAD到内存里面,而类中的方法是被放到CODE SAGEMENT里面,只有在方法在被执行的时候才会被调用。
      

  9.   

    因为构造函数里没有调用fun()方法
      

  10.   


    public class Run { public static void main(String[] args) {
            Test t = new Test();
            t.test();
    }}
    class Test{
       public void test() {
            Test t = new Test();
            System.out.println(t);
       }
    }不会无限递归
      

  11.   

    那句是只会分配空间,做些初始化,然后new会返回一个地址给t
      

  12.   

    1.把函数的创建和函数的调用搞混了,函数的创建只是把函数代码载入到内存,并不执行,函数的调用是指此时pc正指向函数的代码,函数正占用cpu执行。
    2.静态函数和非静态函数的区别仅在于创建时期不同,即载入内存的时间不同,所以静态函数如果会主动调用自身也会产生无限递归