我试图发现初始化发生的顺序,或者说是为什么初始化按此顺序发生的原因。由于代码:Java静态初始化命令
public class Main {
{
System.out.printf("NON-STATIC BLOCK\n");
}
static{
System.out.printf("STATIC BLOCK\n");
}
public static Main m = new Main();
public Main(){
System.out.printf("MAIN CONSTRUCTOR\n");
}
public static void main(String... args) {
//Main m = new Main();
System.out.printf("MAIN METHOD\n");
}
}
输出:
STATIC BLOCK
NON-STATIC BLOCK
MAIN CONSTRUCTOR
MAIN METHOD
然而,在移动m
的声明之前初始化块生产:
NON-STATIC BLOCK
MAIN CONSTRUCTOR
STATIC BLOCK
MAIN METHOD
,为什么它发生在我完全不知道这个命令。此外,如果我在m
的声明中删除了static
关键字,则init块和构造函数都不会触发。任何人都可以帮我解决这个问题吗?
请记住,“非静态块”中的代码将被复制到每个构造函数中。只有初始化块的相对顺序很重要,只有在调用构造函数时(看似“之前”)才会调用它们。 (在静态初始化程序之前或之后,取决于您将移动的行放在哪里)。 – millimoose
现在真正奇怪的是,这意味着您可以在类自身完成初始化之前初始化一个类的实例这听起来像是一个等待发生的奇怪的错误。 – millimoose
@millimoose:谢谢 - 我在回答中添加了一些关于实例初始值设定项的内容。 –