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

Java 类的实例如何递归创建,从而导致stackoverflow错误,java,Java,考虑以下两个程序给出相同的错误 第一次计算: public class Testing { Testing t=new Testing(); public static void main(String args[]){ testing t1=new testing(); } } 二等舱: class foo{ void baz(){ new testing(); } } public c

考虑以下两个程序给出相同的错误 第一次计算:

public class Testing {    
    Testing t=new Testing();        
    public static void main(String args[]){   
        testing t1=new testing();  
    }
}
二等舱:

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();
    }       
}
上面的代码如何给出以下错误? 我知道类的实例是递归创建的,但我想知道如何创建

Exception in thread "main" java.lang.StackOverflowError
    at com.Testing.<init>(Testing.java:4)
    at com.Testing.<init>(Testing.java:4)
由于t1需要初始化t2对象,反之亦然,这就是问题所在:

public class Testing {    
    Testing t=new Testing();  
}
这大致上与:

public class Testing {
    Testing t;

    public Testing() {
        t = new Testing();
    }
}
这使得递归更清晰——构造函数无条件地调用自己

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

在这方面,您的两个类没有明显的不同——创建任何测试实例都会导致堆栈溢出

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

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

    public static void main(String[] args) {
        //anything
    }
}
如果尝试创建测试实例,仍将引发相同的异常。你说t1需要初始化t2对象是错误的——这里的变量之间没有相互依赖关系。每个变量初始值设定项创建一个单独的对象。。。但这些对象中的每一个都会依次尝试创建两个以上的测试实例


请注意,运行main方法不需要测试实例,但如果该main方法直接调用新的测试,或者调用其他调用新测试的方法,那么您将得到堆栈溢出。

您是否想过程序何时结束。。它永远不会结束。它实例化您的第一个对象,同时需要为第一个对象实例化另一个对象,以此类推。所以你的堆栈在某个时候会爆炸


第一个object需要第二个object需要第三个object需要第四个object,而且它还在继续..

以后,请花时间用空格而不是制表符格式化问题的代码。请阅读@Ahmed有两个对象,一个是全局对象,另一个在静态方法中。那么它们是否等待彼此的初始化呢?请详细说明这是如何发生的?第一种情况:当你在main方法中实例化t1时,这个t1对象本身将需要另外一个测试对象假设它的t是正确的…?…现在你的程序去实例化这个t…当实例化这个t时,它会发现哦,见鬼。。这个t还需要一个t,所以它开始实例化这个新的t,它开始忙于实例化一个t,直到你的堆栈爆炸第二种情况:没有什么不同当你开始实例化一个需要它类型的对象的时候,这个问题就出现了。@Ahmed thanx以便快速回复。但是你说这个t1对象本身还需要一个测试对象,为什么它还需要其他对象呢?如果我们做公共类测试{Testing t2=new Testing;Testing t1=new Testing;public static void mainString args[]{//anything},为什么不发生这种情况呢因为t1需要t2,反之亦然。@jon skeet每个测试实例都包含对另一个测试实例的引用。怎样因为一个实例是全局的,另一个在静态方法中,所以静态方法属于类而不是对象。@user980089:测试中有一个实例变量。每个测试实例都有一个t变量。我已经编辑了我的答案以使它更清晰。我已经编辑了我的问题,那么为什么在最后一篇文章中给出的代码没有出现错误。@Jon公共类测试{Testing t;public Testing{t=new Testing;}}看起来不正确。。。?因为只有当代码在方法内部和类级别有新的测试时,才会发生错误。但在新测试仅在类级别或仅在方法内部的情况下,情况并非如此。@user980089:您所说的“看起来不正确”是什么意思?这几乎就是第一段代码的翻译。关键是,如果一个实例变量是用一个调用某些东西的初始值设定项声明的,这在很大程度上等同于将该调用放在构造函数中。
public class Testing { 
    Testing t1 = new Testing(); 
    Testing t2 = new Testing(); 

    public static void main(String[] args) {
        //anything
    }
}