Java 当类的实例本身被创建时,为什么构造函数中的语句不被执行?
实例化类时,将调用其构造函数。在本例中,我想检查何时发生StackOverflow错误。但是构造函数中声明的语句没有执行,为什么? 请参阅下面的代码Java 当类的实例本身被创建时,为什么构造函数中的语句不被执行?,java,constructor,stack-overflow,Java,Constructor,Stack Overflow,实例化类时,将调用其构造函数。在本例中,我想检查何时发生StackOverflow错误。但是构造函数中声明的语句没有执行,为什么? 请参阅下面的代码 public class StackOverFlowSampleMain { StackOverFlowSampleMain oomeSampleMain = new StackOverFlowSampleMain(); static int x = 0; StackOverFlowSampleMain() {
public class StackOverFlowSampleMain {
StackOverFlowSampleMain oomeSampleMain = new StackOverFlowSampleMain();
static int x = 0;
StackOverFlowSampleMain() {
x++; //aren't these lines supposed to be executed?
System.out.println(x);
}
public static void main(String[] args) {
StackOverFlowSampleMain oomeSampleMain = new StackOverFlowSampleMain();
}
}
成员初始化发生在构造函数的主体之前。 因此,当您创建一个
StackOverFlowSampleMain
实例时,它要做的第一件事就是初始化它的oomeSampleMain
成员。反过来,它会尝试初始化自己的oomeSampleMain
成员,依此类推,直到程序崩溃时出现stackoverflowerrror
,因此永远不会达到x
的增量
如果要测量何时发生堆栈溢出错误
,可以将导致该错误的代码移动到构造函数的末尾:
public class StackOverFlowSampleMain {
StackOverFlowSampleMain oomeSampleMain;
static int x = 0;
StackOverFlowSampleMain() {
x++;
System.out.println(x);
oomeSampleMain = new StackOverFlowSampleMain(); // Here, after x is printed
}
}
你能添加一点源代码吗?代码已添加,很抱歉帖子不完整。我不熟悉发帖问题,因此了解到构造函数在
oomeSampleMain
初始化后立即执行-这从未发生过。我不知道这里发生了什么。这是一件疯狂的事情。我没想到这会被编译。它不能做任何好事。当您实例化**StackOverFlowSampleMain**时,它将创建其oomeSampleMain成员。但这是一个StackOverFlowSampleMain。这将创建它的oomeSampleMain成员。但这是一个StackOverFlowSampleMain对象。这将创建它的oomeSampleMain成员。等等等等。你认为这个代码应该做什么?这东西爆炸了!我刚刚运行了它,它实现了我的预期…它使堆栈崩溃。-这里有无限递归。它从不执行构造函数代码,因为它永远不会走那么远。哎呀……但愿我能想到这一点!(议会)。[这并不重要,但这是点击“社区维基”框的绝佳案例,IMO]