这个问题在这里已有答案:
这是我的代码:
public class ConstructorsDemo{
public static void main(String a[]){
Cons1 c1 = new Cons1();
}
}
class Cons1{
Cons1 c = new Cons1();// the error is in this line
Cons1(){
//does somwthing
}
}
所以我在这里得到一个无限循环错误(Stackoverflow)。但是,如果我注释掉我创建的两个对象中的任何一个,那就没关系。
我的代码中的对象c
如何导致Stackoverflow错误?
第一点:这是无限递归,而不是无限循环。有很大的不同。使用无限循环有完全合理的理由,它们通常不会导致堆栈溢出异常。但是,无限递归没有合法的用例,它的使用总会导致堆栈溢出异常。 (我想你可能会在一些奇怪的情况下争论无限的尾递归,对于那些具有但仍然......的语言)如果你得到一个堆栈溢出异常,它几乎肯定是无限递归而不是无限循环。
正如其他人所指出的,这里的基本问题是,每当你调用“new”时,它反过来会创建一个新对象,然后创建一个新对象,依此类推。
Cons1 c = new Cons1();
让我们来看看你的课程。
它有一个(空)构造函数,以及与该类相同类型的字段。
并且该字段直接初始化。
事情是:Java中有一个well-defined process,它指示如何/何时调用构造函数,以及如何初始化类的字段。好吧,成员字段被初始化为“新”调用的一部分。
导致:当你的主类中调用“new”时,应该创建并初始化一个新的Cons1对象。 Cons1对象具有Cons1字段。这需要使用...初始化新的Cons1对象,依此类推。
这就是你在Java中创建第一个永无止境的递归的方式。
Cons1 c = new Cons1();//
请删除此声明并在您要使用它的任何地方初始化它。代码是递归的。
你是以递归方式创建对象的,每次创建对象时都会遇到无限循环而导致堆栈溢出