4

任何人都可以在下面的代码中帮助理解运行时的 StackOverFlowError。我无法理解工作流程。面试题之一:)

public class Interview {

    Interview i1 = new Interview();
    Interview(){
        System.out.println("Hello");

    }

    public static void main(String[] args){

        Interview i = new Interview();

    }

}
4

5 回答 5

3

您的构造函数正在初始化自己。这是您的构造函数在 JVM 中的样子:

Interview i1;
Interview(){
    super();
    i1 = new Interview(); // this line calls the constructor
    System.out.println("Hello");
}
于 2013-09-15T04:02:05.767 回答
3

Interview i1 = new Interview();说每个Interview人都有属于它自己的 Interview对象,所以一旦你调用new Interview()main系统就会开始尝试Interview为那个创建一个新的,并为那个创建一个新的Interview......

它甚至永远不会进入(显式)构造函数,因为系统首先会在一个永无止境的 new 链上运行Interview。您几乎肯定应该从课程中删除该i1字段。Interview

于 2013-09-15T04:02:57.380 回答
2

每次Interview实例化Interview. 这导致构造函数调用和实例化的无休止循环,最终耗尽您的堆栈空间(因为函数调用占用堆栈空间)。

请注意,如果您有无限的可用堆栈空间,您最终会Interview因为堆上分配的所有对象而失败。

于 2013-09-15T04:01:50.437 回答
1

因为一旦你初始化了第一个Interview()main()它就会创建并初始化第二个Interview,它会创建并初始化另一个,依此类推。

于 2013-09-15T04:02:16.800 回答
0

您在字段中执行的所有初始化都将成为无参数构造函数的一部分(在您的情况下)。

所以,你的代码会变成

public class Interview 
{

    Interview i1;
    Interview()
    {
        super();//by default calls the constructor of Object
        i1 = new Interview();//initialization becomes part of constructor
        System.out.println("Hello");
    }

}

现在这将递归地使 Interview 实例化导致异常

于 2013-09-15T04:09:52.467 回答