执行时,下面的代码会产生堆栈溢出错误。但是,如果删除其中之一
static final GenerateStackOverflow E1 = new GenerateStackOverflow("value1");
final GenerateStackOverflow E2 = new GenerateStackOverflow("value2");
它在没有堆栈溢出错误的情况下运行。如果我有上面的两行,怎么会出现堆栈溢出错误,但如果只有一行是在类中,则没有错误?
public class GenerateStackOverflow {
private final String value;
static final GenerateStackOverflow E1 = new GenerateStackOverflow("value1");
final GenerateStackOverflow E2 = new GenerateStackOverflow("value2");
public GenerateStackOverflow(String value) {
System.out.println("GenerateStackOverflow.GenerateStackOverflow()");
this.value = value;
}
public String getValue() {
return value;
}
public static void main(String[] args) {
GenerateStackOverflow.class.getName();
}
}
发布于 2019-02-19 14:09:51
构造函数调用自身:
final GenerateStackOverflow E2 = new GenerateStackOverflow("value2");
因此,要构造一个实例,您需要构造一个需要构造实例的实例,等等。
你的程序的main方法加载了这个类。并且有一个静态字段调用类的构造函数,这会创建堆栈溢出。因此,删除静态变量会隐藏问题,因为永远不会调用构造函数。删除非静态变量会完全删除递归调用,从而修复了probem。
https://stackoverflow.com/questions/-100006367
复制相似问题