Ответ 1
Я думаю, что вы просто отсутствуете раздел 12.4.2 JLS, который включает в себя:
Затем выполните либо инициализаторы переменной класса, и инициализаторы статического класса, или инициализаторы полей интерфейса, в текстовом порядке, как если бы они были одним блоком.
Часть "в текстовом порядке" является важным битом.
Если вы измените m
как статическую переменную на переменную экземпляра, тогда поле не будет инициализировано инициализацией класса - оно будет инициализироваться только инициализацией экземпляра (т.е. при создании экземпляра). На данный момент это вызовет переполнение стека - для создания одного экземпляра требуется создать другой экземпляр, который требует создания другого экземпляра и т.д.
EDIT: аналогично раздел 12.5 указывает инициализацию экземпляра, включая следующие шаги:
Выполните инициализаторы экземпляра и инициализаторы переменных экземпляра для этого класса, присваивая значения инициализаторов переменной экземпляра соответствующим переменным экземпляра в порядке слева направо, в котором они отображаются в текстовом виде в исходном коде для класс. Если выполнение любого из этих инициализаторов приводит к исключению, то никакие новые инициализаторы не обрабатываются, и эта процедура завершается внезапно с тем же исключением. В противном случае перейдите к шагу 5.
Выполните оставшуюся часть тела этого конструктора. Если это выполнение завершается внезапно, то эта процедура завершается внезапно по той же причине. В противном случае эта процедура выполняется нормально.
Итак, почему вы видите "НЕСТАТИЧЕСКИЙ БЛОК" до "ГЛАВНОГО КОНСТРУКТОРА".