1

当我们在 java 中加载一个类时,首先执行静态块,然后执行默认构造函数。但是在下面的代码中,我观察到默认构造函数是在静态块之前执行的。

    public class Hello {

    private static Hello hello = new Hello();

    public Hello() {
        System.out.println("Hello Default Constructor");
    }

    static {
        System.out.println("Hello Static Block");
    }

    public static Hello createHelloInstance() {
        return hello;
    }
}

主类:

   public class MainTest {

        public static void main(String a[])
        {
            Hello.createHelloInstance();
        }
    }

输出:

Hello Default Constructor
Hello Static Block

我需要知道这背后的基本概念。这是怎么回事。? 有人可以帮助我了解其背后的流程。

4

3 回答 3

3

与实例字段初始化表达式插入构造函数的方式相同,静态字段初始化表达式按出现顺序插入静态初始化表达式。

所以

private static Hello hello = new Hello();

...

static {
    System.out.println("Hello Static Block");
}

相当于:

private static Hello hello;

...

static {
    hello = new Hello();
    System.out.println("Hello Static Block");
}
于 2020-03-21T13:27:08.633 回答
1

您有一个静态成员 ( ),它通过调用默认构造函数hello的调用进行初始化。new Hello()由于该成员是在static块之前声明的,因此将首先对其进行初始化。如果你在块之后移动它,块将首先被执行:

public class Hello {
    static {
        System.out.println("Hello Static Block");
    }
    private static Hello hello = new Hello();

    // etc...
}

或者更好的是,通过在块内移动初始化来明确顺序。

public class Hello {
    private static Hello hello;
    static {
        System.out.println("Hello Static Block");
        hello = new Hello();
    }

    // etc...
}
于 2020-03-21T13:29:57.150 回答
0

是的,但是你有这行代码:

private static Hello hello = new Hello();

这就是为什么你首先执行构造函数的原因。静态初始化器在构造函数之前执行。

于 2020-03-21T13:30:00.627 回答