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

在java中,默认构造函数在静态块之前执行,java,constructor,static-initializer,Java,Constructor,Static Initializer,在java中加载类时,首先执行静态块,然后执行默认构造函数。但在下面的代码中,我观察到默认构造函数是在静态块之前执行的 public class Hello { private static Hello hello = new Hello(); public Hello() { System.out.println("Hello Default Constructor"); } static { System.out.

在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
我需要知道这背后的基本概念。发生了什么事?
有没有人能帮我理解它背后的流程。

同样,实例字段初始值设定项表达式被插入构造函数,静态字段初始值设定项表达式也被按外观顺序插入静态初始值设定项

所以

相当于:

private static Hello hello;

...

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

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

所以

相当于:

private static Hello hello;

...

static {
    hello = new Hello();
    System.out.println("Hello Static Block");
}
您有一个静态成员hello,它用一个调用默认构造函数的新hello调用进行初始化。由于此成员在静态块之前声明,因此将首先初始化它。如果将其移动到块之后,将首先执行块:

公共课你好{ 静止的{ System.out.printlnHello静态块; } 私有静态Hello=newhello; //等等。。。 } 或者更好的方法是,通过在块内移动初始化来明确顺序

公共课你好{ 私人静你好你好; 静止的{ System.out.printlnHello静态块; hello=新的hello; } //等等。。。 } 您有一个静态成员hello,它用一个调用默认构造函数的新hello调用进行初始化。由于此成员在静态块之前声明,因此将首先初始化它。如果将其移动到块之后,将首先执行块:

公共课你好{ 静止的{ System.out.printlnHello静态块; } 私有静态Hello=newhello; //等等。。。 } 或者更好的方法是,通过在块内移动初始化来明确顺序

公共课你好{ 私人静你好你好; 静止的{ System.out.printlnHello静态块; hello=新的hello; } //等等。。。 }
是的,但您有以下代码行:

private static Hello hello = new Hello();

这就是为什么首先执行构造函数的原因。静态初始值设定项在构造函数之前执行。

是的,但您有以下代码行:

private static Hello hello = new Hello();

这就是为什么首先执行构造函数的原因。静态初始值设定项在构造函数之前执行。

在静态字段初始值设定项中调用默认构造函数。在静态块之前调用的。在静态字段初始值设定项中调用默认构造函数。在静态块之前调用。