初始化操作的一般顺序是(在加载类之后和首次使用之前):
- 静态(类)代码块在代码中的显示顺序,
- 目标代码块按其出现在代码中的顺序排列(初始化块和分配)。
- 建设者
当然,我没有将构造函数和函数体称为上面的代码块。
我不知道final static
领域。看起来它们遵循static
字段规则,并且尽管在注释之前已在编译步骤对其进行了初始化,但它们在声明之前无法被引用。如果在编译错误之前引用了它们:
Example.java:8: illegal forward reference
System.err.println("1st static block j=" + j);
也许final static
可以将字段初始化并编译到类文件中,但这不是一般规则,并且在声明之前仍不能引用它们。
检查初始化顺序的示例代码:
class Example {
final static int j = 5;
{
System.err.println("1st initializer j=" + j);
}
static {
System.err.println("1st static block j=" + j);
}
static {
System.err.println("2nd static block j=" + j);
}
final static java.math.BigInteger i = new java.math.BigInteger("1") {
{
System.err.println("final static anonymous class initializer");
}
};
Example() {
System.err.println("Constructor");
}
static {
System.err.println("3nd static block j=" + j);
}
{
System.err.println("2nd initializer");
}
public static void main(String[] args) {
System.err.println("The main beginning.");
Example ex = new Example();
System.err.println("The main end.");
}
}
上面的代码片段打印:
1st static block j=5
2nd static block j=5
final static anonymous class initializer
3nd static block j=5
The main beginning.
1st initializer j=5
2nd initializer
Constructor
The main end.