gpt4 book ai didi

Java : recursive constructor call and stackoverflow error

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:43:05 24 4
gpt4 key购买 nike

请帮助理解为什么下面的代码

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”。我的问题是了解构造函数是否像其他方法一样分配堆栈帧,因为在构造函数返回之前对象创建尚未完成。希望这能澄清。

最佳答案

每当调用构造函数时,它的返回地址 都会被推送到the stack 上.由于堆栈是有限的并且小于堆内存,您会收到类似 StackOverflowError 而不是 OutOfMemoryError 的错误。

The constructor is a method and since the heap memory is much larger than the stack memory, the recursive constructor call resulted in StackOverflowError. Is this correct ?

是的,您的大胆猜测是完全正确的。干杯!

关于Java : recursive constructor call and stackoverflow error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30911823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com