默认构造函数在 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();
这就是您首先执行构造函数的原因。静态初始化程序在构造函数之前执行。
当我们在 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();
这就是您首先执行构造函数的原因。静态初始化程序在构造函数之前执行。