0

考虑以下 2 个给出相同错误的程序
第一次调用:

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)

如果我们这样做,为什么不会发生这种情况

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

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

4

2 回答 2

7

这就是问题:

public class Testing {    
    Testing t=new Testing();  
}

这与以下内容大致相同:

public class Testing {
    Testing t;

    public Testing() {
        t = new Testing();
    }
}

这使得递归更清晰——构造函数无条件地调用自己。

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

你的两个类在这方面没有显着不同 - 创建任何实例Testing都会导致堆栈溢出。

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

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

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

如果您尝试创建Testing. 但是,您说“t1 将需要初始化 t2 对象”是错误的-这里的变量之间没有相互依赖关系。每个变量初始值设定项都会创建一个单独的对象……但这些对象中的每一个都会依次尝试创建Testing.

请注意,运行该方法不需要Testing实例main- 但如果该main方法new Testing直接调用或调用其他调用的方法new Testing(),那么您将获得堆栈溢出。

于 2012-06-27T07:28:59.880 回答
3

有没有想过你的程序什么时候结束……它永远不会。它实例化您的第一个对象,同时实例化它需要为第一个对象实例化另一个对象,依此类推。所以你的堆栈有时会爆炸。

第一个对象(需要第二个对象(需要第三个对象(需要第四个对象)))并且它继续......

于 2012-06-27T07:29:38.030 回答