Итак, статический блок будет выполнен, как только загрузчик класса загрузит класс.Итак, ваш первый статический блок static { new Foo(); }
выполняется первым, что дополнительно вызывает конструктор new Foo();
.Согласно java docs нестатический блок будет скопирован в каждый конструктор компилятором , что означает, что System.out.println("non static code");
будет скопирован в конструктор public Foo() { System.out.println("constructor"); }
.Таким образом, сначала будет напечатано non static code
, затем constructor
.После выполнения первого статического блока он выполнит второй статический блок, который печатает последний static code
.
После компиляции ваш код выглядит примерно так, как показано ниже:
public class Foo {
static { new Foo(); }
static{ System.out.println("static code"); }
public Foo() {
System.out.println("non static code");
System.out.println("constructor");
}
public static void main(String[] args) {}
}