Java 中的静态/实例初始值设定项块以什么顺序运行?
2022-08-31 10:08:16
假设一个项目包含多个类,每个类都有一个静态初始值设定项块。这些块以什么顺序运行?我知道在类中,这些块按照它们在代码中出现的顺序运行。我已经读到它跨类是相同的,但我写的一些示例代码不同意这一点。我用了这个代码:
package pkg;
public class LoadTest {
public static void main(String[] args) {
System.out.println("START");
new Child();
System.out.println("END");
}
}
class Parent extends Grandparent {
// Instance init block
{
System.out.println("instance - parent");
}
// Constructor
public Parent() {
System.out.println("constructor - parent");
}
// Static init block
static {
System.out.println("static - parent");
}
}
class Grandparent {
// Static init block
static {
System.out.println("static - grandparent");
}
// Instance init block
{
System.out.println("instance - grandparent");
}
// Constructor
public Grandparent() {
System.out.println("constructor - grandparent");
}
}
class Child extends Parent {
// Constructor
public Child() {
System.out.println("constructor - child");
}
// Static init block
static {
System.out.println("static - child");
}
// Instance init block
{
System.out.println("instance - child");
}
}
并得到这个输出:
START
静态 - 祖父母
静态 - 父
静态 - 子
实例 - 祖父母
构造函数 - 祖父母
实例 - 父
构造函数 - 父
实例 - 子
构造函数 - 子
END
从中得到的明显答案是,父母的区块在孩子的区块之前运行,但这可能只是一个巧合,如果两个班级不在同一层次结构中,则无济于事。
编辑:
我通过将其附加到 LoadTest 来修改我的示例代码.java:
class IAmAClassThatIsNeverUsed {
// Constructor
public IAmAClassThatIsNeverUsed() {
System.out.println("constructor - IAACTINU");
}
// Instance init block
{
System.out.println("instance - IAACTINU");
}
// Static init block
static {
System.out.println("static - IAACTINU");
}
}
正如类名所暗示的那样,我从未在任何地方引用过新类。新程序产生的输出与旧程序相同。