当自己创建一个类的实例时,为什么不执行构造函数中的语句?

时间:2019-04-03 04:43:18

标签: java constructor stack-overflow

实例化一个类时,将调用其构造函数。在此示例中,我想检查何时发生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();

    }
}

1 个答案:

答案 0 :(得分:1)

成员初始化发生在构造函数的主体之前。 因此,当您创建一个StackOverFlowSampleMain实例时,它要做的第一件事就是初始化其oomeSampleMain成员。反过来,它尝试初始化自己的oomeSampleMain成员,依此类推,直到程序因StackOverflowError而崩溃,所以x的增量从未达到。

如果要测量StackOverflowError发生的时间,可以将导致它的代码移到构造函数的末尾:

public class StackOverFlowSampleMain {
    StackOverFlowSampleMain oomeSampleMain;
    static int x = 0;

    StackOverFlowSampleMain() {
        x++;
        System.out.println(x);
        oomeSampleMain = new StackOverFlowSampleMain(); // Here, after x is printed
    }
}