类的实例是如何递归创建的,从而导致stackoverflow错误

use*_*089 0 java

考虑以下2个程序给出相同的错误
First calss:

public class Testing {    
    Testing t=new Testing();        
    public static void main(String args[]){   
        testing t1=new testing();  
    }
}
Run Code Online (Sandbox Code Playgroud)

二等:

class foo{
    void baz(){
        new testing();
    }
}
public class testing {
    testing t=new testing();    
    public static void main(String args[]){
    foo f=new foo();
        f.baz();
    }       
}
Run Code Online (Sandbox Code Playgroud)

上面的代码如何给出以下错误?
我知道类的实例是递归创建但我想知道如何?

Exception in thread "main" java.lang.StackOverflowError
    at com.Testing.<init>(Testing.java:4)
    at com.Testing.<init>(Testing.java:4)
Run Code Online (Sandbox Code Playgroud)

如果我们这样做,为什么不这样呢?

    public class testing { 
    testing t2=new testing(); 
    testing t1=new testing(); 
    public static void main(String args[])
    {//anything}
    }
Run Code Online (Sandbox Code Playgroud)

因为t1将要求t2对象被初始化,反之亦然?

Jon*_*eet 7

这就是问题:

public class Testing {    
    Testing t=new Testing();  
}
Run Code Online (Sandbox Code Playgroud)

这大致相同:

public class Testing {
    Testing t;

    public Testing() {
        t = new Testing();
    }
}
Run Code Online (Sandbox Code Playgroud)

这使得递归更加清晰 - 构造函数无条件地调用自身.

每个实例都Testing包含对另一个实例的引用Testing.这不一定是个问题 - 但它就在这里,因为它正在创建一个新的实例Testing.因此,创建"最外层"实例会立即触发另一个实例的创建...这会触发创建另一个实例,等等.

在这方面,您的两个类没有显着差异 - 创建任何实例Testing都会导致堆栈溢出.

编辑:关于此代码(名称和格式改进):

public class Testing { 
    Testing t1 = new Testing(); 
    Testing t2 = new Testing(); 

    public static void main(String[] args) {
        //anything
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您尝试创建的实例仍然抛出同样的异常Testing.你说't1将需要t2对象进行初始化'是错误的 - 这里的变量之间没有相互依赖关系.每个变量初始化创建一个单独的对象......但每次的那些对象将依次尝试创建的两个实例Testing.

需要注意的是实例Testing以运行所需的main方法-但如果该main方法调用要么new Testing直接,或调用一些别的这就要求new Testing(),那么你会得到堆栈溢出.