В каком порядке запускаются статические/экземплярные блоки инициализатора в Java?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 В каком порядке запускаются статические/экземплярные блоки инициализатора в Java?

Сообщение Anonymous »

Предположим, проект содержит несколько классов, каждый из которых имеет статический блок инициализатора. В каком порядке работают эти блоки? Я знаю, что внутри класса такие блоки выполняются в том порядке, в котором они появляются в коде. Я читал, что это одинаково для всех классов, но некоторые примеры кода, которые я написал, с этим не согласны. Я использовал этот код:

Код: Выделить всё

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 - дедушка

static - родитель

статический - дочерний экземпляр

экземпляр - дедушка

конструктор - дедушка

экземпляр - родительский

конструктор - родительский

экземпляр - дочерний

конструктор - дочерний

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");
}
}
Как следует из названия класса, я никогда и нигде не ссылался на новый класс. Новая программа выдала тот же результат, что и старая.

Подробнее здесь: https://stackoverflow.com/questions/200 ... n-java-run
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»