最佳答案
假设一个项目包含几个类,每个类都有一个静态初始化器块。这些积木按什么顺序排列?我知道在一个类中,这样的块是按照它们在代码中出现的顺序运行的。我读到过类之间是相同的,但是我编写的一些示例代码不同意这一点。我用了这个代码:
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");
}
}
正如类名所暗示的那样,我从未在任何地方引用新类。新程序产生了与旧程序相同的输出。