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