Порядок выполнения инициализатора блоков и инициализатора переменной задается в JLS § 12.5:
Непосредственно перед ссылкой на вновь созданный объект возвращается в качестве результата , указанный конструктор обрабатывается для инициализации нового объекта в следующем порядке:
[...]
-выполнять экземпляр инициализаторы и экземпляр инициализаторы переменной для данного класса, присвоение значения переменных экземпляра инициализаторов до соответствующего переменных, например, в слева-направо порядок, в котором они отображаются текстовыми в исходном коде для класса. [..]
Итак, блоки инициализатора и инициализаторы переменных выполняются в порядке их появления в исходном файле. Если вы переместите объявление переменной, int x = 1;
, перед блоком инициализатора вы получите результат 2
.
Технически, ваш Test
класс компилируется в этом:
class TestClass {
int x;
public TestClass() {
super();
x = 2;
x = 1;
}
}
Для фактического байткод вы можете запустить javap -c
команду.
Не на самом деле - он скомпилирован не иметь не ARGS конструктор, который содержит эти две строки. –
Я не думаю, что код скомпилирован. Инициализаторы перемещаются в конструктор, добавленный компилятором. –
@ user3007882 Пожалуйста, удалите слово * скомпилировано *, оставьте * эквивалент * и все в порядке :) – MariuszS