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

问题描述 投票:0回答:4

这是我的代码:

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错误?

java object constructor stack-overflow
4个回答
0
投票

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

正如其他人所指出的,这里的基本问题是,每当你调用“new”时,它反过来会创建一个新对象,然后创建一个新对象,依此类推。

Cons1 c = new Cons1();

2
投票

让我们来看看你的课程。

它有一个(空)构造函数,以及与该类相同类型的字段。

并且该字段直接初始化。

事情是:Java中有一个well-defined process,它指示如何/何时调用构造函数,以及如何初始化类的字段。好吧,成员字段被初始化为“新”调用的一部分。

导致:当你的主类中调用“new”时,应该创建并初始化一个新的Cons1对象。 Cons1对象具有Cons1字段。这需要使用...初始化新的Cons1对象,依此类推。

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


1
投票
Cons1 c = new Cons1();// 

请删除此声明并在您要使用它的任何地方初始化它。代码是递归的。


0
投票

你是以递归方式创建对象的,每次创建对象时都会遇到无限循环而导致堆栈溢出

© www.soinside.com 2019 - 2024. All rights reserved.