默认构造函数在 java 中的静态块之前执行

Default Constructor is getting executed before Static block in java

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

    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;
    }
}

主要Class:

   public class MainTest {

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

输出:

Hello Default Constructor
Hello Static Block

我需要知道这背后的基本概念。这是怎么回事。 ? 谁能帮我理解这背后的流程。

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

所以

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");
}

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

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...
}

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

private static Hello hello = new Hello();

这就是您首先执行构造函数的原因。静态初始化程序在构造函数之前执行。