为什么在使用构造函数在 class 中创建对象时出现无限循环(Stackoverflow 错误)?

Why do I get Infinite loop(Stackoverflow error) while creating an object in a class with constructor?

这是我的代码:

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

    }
}

所以我在这里遇到了一个无限循环错误 (Whosebug)。 但是,如果我注释掉我创建的两个对象中的任何一个,那就没问题了。

我的代码中的对象 c 是如何导致 Whosebug 错误的?

Cons1 c = new Cons1();// 

请删除此语句并在您要使用它的任何地方对其进行初始化。代码是递归的。

您正在递归地创建对象,每次创建对象时,这就是您获得无限循环并且 导致堆栈溢出的原因

让我们看看你的class。

它有一个(空的)构造函数,以及一个与 class.

类型相同的字段

并且该字段直接就地初始化。

事情是:Java 中有一个 well-defined process 指示调用 how/when 构造函数,以及如何初始化 class 的字段。好吧,成员字段被初始化为调用 "new".

的一部分

导致:当在您的 class 中调用 "new" 时,应创建并初始化一个新的 Cons1 对象。该 Cons1 对象具有该 Cons1 字段。这需要用...初始化一个新的 Cons1 对象等等。

这就是您在 Java 中创建第一个永无止境递归的方式。

第一点:这是无限递归,不是无限循环。有很大的不同。使用无限循环有完全正当的理由,而且它们通常不会导致堆栈溢出异常。但是,没有 无限递归的合法用例,它的使用将总是 导致堆栈溢出异常。 (我想你可能会在一些奇怪的情况下为拥有无限尾递归的语言争辩,但仍然......)如果你遇到堆栈溢出异常,它 几乎可以肯定 无限递归而不是无限循环。

正如其他人所指出的,这里的基本问题是,每次调用 "new" 时,它都会依次创建一个新对象,而该对象又会创建一个新对象,依此类推第四。

Cons1 c = new Cons1();