Говорите, что проект содержит несколько классов, каждый из которых имеет статический блок инициализатора. В каком порядке выполняются эти блоки? Я знаю, что в классе такие блоки выполняются в том порядке, в котором они появляются в коде. Я читал, что он одинаковый по классам, но какой-то пример кода, который я написал, не согласуется с этим. Я использовал этот код:
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
статичный - бабушка и дедушка
static - parent
static - child
пример - grandparent
конструктор - grandparent
экземпляр - родительский конструктор - родительский
экземпляр - ребенок
конструктор - ребенок
END
Очевидный ответ на этот вопрос состоит в том, что блоки родителей выполняются перед их дочерними элементами, но это может быть просто совпадением и не помогает, если два класса не находятся в одной иерархии.
EDIT:
Я изменил свой пример кода, добавив его в 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");
}
}
Как подразумевается именем класса, я никогда не ссылался на новый класс нигде. Новая программа произвела тот же результат, что и старый.