一个项目包含多个类,每个类都有一个静态初始化块。这些块以什么顺序运行?我知道在一个类内部,这样的块按照它们在代码中出现的顺序运行。我读过一些资料说在不同的类中也是如此,但我写的一些示例代码与此不符。我用了以下代码:
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");
}
}
运行结果如下:
开始
静态 - 祖父类
静态 - 父类
静态 - 子类
实例 - 祖父类
构造函数 - 祖父类
实例 - 父类
构造函数 - 父类
实例 - 子类
构造函数 - 子类
结束
从中可以看出,父类的块在子类的块之前运行,但这可能只是巧合,并且对于不在同一继承层次结构中的两个类没有帮助。
编辑:
我修改了我的示例代码,将以下内容追加到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");
}
}
正如类名所示,我在任何地方都没有引用新类。 新程序产生了与旧程序相同的输出。