当我们在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
我需要了解其背后的基本概念。那是怎么回事。 ?有人可以帮助我了解其背后的流程。
所以
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
块之前声明的,因此将首先对其进行初始化。如果将其移动到块之后,将首先执行该块: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();
这就是为什么要先执行构造函数的原因。静态初始化程序在构造函数之前执行。