Поскольку мы знаем, что instance block
вызывается перед constructor
. Технические характеристики, Ответ на переполнение стека и т. д.
Итак, вывод, который мы ожидаем от кода ниже:
class Test{
static { System.out.println("Static Block"); }
{ System.out.println("Instance Block"); }
Test(){
System.out.println("Constructor Body");
{ System.out.println("Constructor Instance Block"); }
}
}
class TestApp{
public static void main(String[] args){
new Test();
}
}
Должно быть:
Static Block
Instance Block
Constructor Instance Block
Constructor Body
Тогда почему я получаю следующий вывод:
Static Block
Instance Block
Constructor Body
Constructor Instance Block
Но если я изменю порядок операторов в constructor
, например:
class Test{
static { System.out.println("Static Block"); }
{ System.out.println("Instance Block"); }
Test(){
{ System.out.println("Constructor Instance Block"); }
System.out.println("Constructor Body");
}
}
Затем он выводит ожидаемый результат, но этого не должно быть, потому что в документах говорится, что instance block
вызывается перед constructor
.
Почему instance block
вызывается после тела constructor
или мы можем сказать, почему он вызывается по порядку?
{ System.out.println("Constructor Instance Block"); }
не является блоком инициализации. Это просто случайный блок кода в конструкторе. - person ernest_k   schedule 20.12.2018super
, между вызовомsuper
и остальной частью тела этого конструктора. - person Andy Turner   schedule 20.12.2018instance blocks
иstatic blocks
применимы и разрешены для использования в их реальном значении, одно место, которое я знаю, этоclass
, есть ли другие места, где они также применимы? - person Stack Overflow   schedule 20.12.2018