помогите понять очерёдность выполнения блоков в коде

имеем код

public class Test {
    {
        System.out.println("block 1");
    }

    static {
        System.out.println("static 2");
    }

    Test() {
        System.out.println("constructor 3");
    }

    {
        System.out.println("block 4");
    }


    public static void main(String[] args) {
        Test test1 = new Test();
        {
            System.out.println("main 5");
        }

    }
}

вывод :

static 2
block 1
block 4
constructor 3
main 5

если я правильно понял, статические блоки отрабатывают единожды и в первую очередь на уровне класса... тогда почему после static 2 не отработал конструктор в статик методе? а потом уже блок 1 и 4 и 5? Хотя в дебагере после вывода статик2 скакнул в конструктор , но не напечатал constructor 3.


Ответы (1 шт):

Автор решения: Barmaley

Механизм очередности получается такой:

  1. сначала загружаем класс (работает ClassLoader) при нем вызывается static 2
  2. Далее начинается поиск точки входа, которой всегда является static main(), который является частью класса Test, соответственно срабатывают инициализирующие блоки класса Test (Instance Initializer Block) (block 1/4)
  3. Далее static main() - срабатывает constructor 3
  4. За ним уже main 5
→ Ссылка