package qwertyuiop;
public class Confusion {
Confusion com = new Confusion();
public static void main(String[] args) {
Confusion con = new Confusion();
System.out.println(4);
con.A();
System.out.println(5);
}
public void B() {
System.out.println(3);
}
public void A() {
System.out.println(4);
com.B();
System.out.println(4);
}
}
我知道代码是错误的,但是我想知道为什么会抛出StackOverflowError
。我也想知道这段代码是如何在内部执行的。
答案 0 :(得分:3)
创建con
时,将创建其成员(com
)。当您尝试创建com
时,将创建它的成员(另一个com
)。重复此过程,直到堆栈溢出。
如果您不想多次发起com
,则可以使其成为static
成员:
static Confusion com = new Confusion();
答案 1 :(得分:1)
让我们从基础知识开始(如果您已经了解堆栈和堆,可以跳过这些基础知识):
程序执行的主要内存基本上分为两部分:堆栈和堆。
在程序中,对象的原语和引用存储在堆栈中,而对象的数据存储在堆中,该堆由存储的引用进行引用在堆栈中。
现在,每次使用new关键字时,都会将堆中的新内存分配给您的对象,并将其地址/引用存储在堆栈中。
如果您知道以下内容,请从此处阅读:
针对您的问题,在构造函数中,您再次调用构造函数本身,这会导致递归情况,在这种情况下,构造函数会一次又一次地调用自身,从而再次执行 new ,再次,因此将对越来越多的堆插槽的引用添加到堆栈中,直到耗尽内存为止。
出现异常。