main方法执行时不执行静态块

时间:2015-10-20 18:20:47

标签: java

我有一个这样的课 -

class A {
    static {
        A obj = new A();
    }
    int x = 0;

    public A() {}

    public static int square(int x) {
        return x * x;
    }
    public static void main(String[] args) {
        //A obj = new A();
        System.out.println("Hello World!" + square(4));
    }
}

如果我们在StackOverFlowException方法中创建一个新对象,则代码会给main,因为代码会陷入无限循环。对于静态块也应该如此。但鉴于代码编译并运行正常。任何人都可以解释这种行为吗?

2 个答案:

答案 0 :(得分:0)

在静态块中移动A obj = new A();将导致A对象仅创建一次。这是因为您的默认构造函数为空,并且它不会调用其他对象的创建。 如果构造函数包含创建另一个Object的调用,它将递归调用创建更多对象

第一种情况: -

static {
        A obj = new A();
    }
    int x = 0;

    public A() {}  ///// gets executed due to static initalizer and stops there.

第二种情况: -

public A() {

  A obj = new A();
}  ///// recursively calls Objects resulting in `StackOverFlowException`

答案 1 :(得分:0)

如果我不得不猜测,你已经用这种方式写了你的程序:

public A() 
{
    A obj = new A();
}

并且您没有正确地将代码复制到此问题中。

无论如何,上面的代码在构造函数中创建了一个新实例,它导致了一系列永不停止的调用,最终填满了可用的堆栈空间并导致堆栈溢出异常。这与静态块无关。