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

问题描述 投票:0回答:3

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

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

我需要了解其背后的基本概念。那是怎么回事。 ?有人可以帮助我了解其背后的流程。
java
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"); }


0
投票
您有一个静态成员(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... }


0
投票
是,但是您有这行代码:

private static Hello hello = new Hello();

这就是为什么要先执行构造函数的原因。静态初始化程序在构造函数之前执行。
© www.soinside.com 2019 - 2024. All rights reserved.