Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当类的实例本身被创建时,为什么构造函数中的语句不被执行?_Java_Constructor_Stack Overflow - Fatal编程技术网

Java 当类的实例本身被创建时,为什么构造函数中的语句不被执行?

Java 当类的实例本身被创建时,为什么构造函数中的语句不被执行?,java,constructor,stack-overflow,Java,Constructor,Stack Overflow,实例化类时,将调用其构造函数。在本例中,我想检查何时发生StackOverflow错误。但是构造函数中声明的语句没有执行,为什么? 请参阅下面的代码 public class StackOverFlowSampleMain { StackOverFlowSampleMain oomeSampleMain = new StackOverFlowSampleMain(); static int x = 0; StackOverFlowSampleMain() {

实例化类时,将调用其构造函数。在本例中,我想检查何时发生StackOverflow错误。但是构造函数中声明的语句没有执行,为什么? 请参阅下面的代码

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]