【发布时间】:2015-09-03 21:11:45
【问题描述】:
请帮助理解为什么下面的代码
public class HeapQn1 {
/**
* @param args
*/
public HeapQn1() {
new HeapQn1();
}
static HeapQn1 n = new HeapQn1();
public static void main(String[] args) {
}
}
结果
java.lang.StackOverflowError
at com.rg.test.interview.HeapQn1.<init>(HeapQn1.java:8)
at com.rg.test.interview.HeapQn1.<init>(HeapQn1.java:9)
...
据我了解,对象的内存分配发生在堆内存中,我预计会出现 OutOfMemoryError,因为在某些时候堆内存会因为重复创建对象而被填满。
在研究中,我发现 java 构造函数被认为是一种方法,并解释了 StackOverflowError ,直到我阅读了以下线程。
When does the Constructor gets called in java?
上面写着
3. The object is fully constructed/created when the constructor returns.
据我所知,构造函数是一种方法,由于堆内存比堆栈内存大得多,递归构造函数调用导致 StackOverflowError 。这是正确的吗?
由于给定代码中没有对象会被完全创建,构造函数的堆栈帧分配是否真的会发生?
--编辑-- 对于指出的重复项,我确实了解 StackoverflowError 是什么。我在“在研究中,我发现 java 构造函数被认为是一种方法并解释了 StackOverflowError”的问题中提到过。我的问题是要了解构造函数是否像其他方法一样获得分配的堆栈帧,因为在构造函数返回之前对象创建尚未完成。希望这可以澄清。
【问题讨论】:
-
你可以通过设置非常小的堆大小来测试......
-
@Raedwald - 我了解 StackOverflowError 是什么,我的问题是 1. 为什么代码没有以 OutOfMemoryError 结束 2. 构造函数是一种方法。
-
我做了一些实证实验,并在我的回答中总结了它们。看看吧:)
标签: java recursion constructor