2014-01-11 5 views
4

Вот несколько простых java-кодов.Инициализировать переменную внутри класса без конструктора

class Test { 
    public static void main(final String[] args) { 
     TestClass c = new TestClass(); 
     System.out.println(c.x); 
    } 
} 

class TestClass { 
    { 
     x = 2; 
    } 
    int x = 1; 
} 

Я получаю ответ 1. Почему? Нет ли конструктора, используемого для инициализации?

ответ

6

TestClass компилируется быть эквивалентно следующему:

class TestClass { 
    { 
     this.x = 2; 
    } 

    int x; 

    { 
     this.x = 1; 
    } 
} 
+1

Не на самом деле - он скомпилирован не иметь не ARGS конструктор, который содержит эти две строки. –

+0

Я не думаю, что код скомпилирован. Инициализаторы перемещаются в конструктор, добавленный компилятором. –

+0

@ user3007882 Пожалуйста, удалите слово * скомпилировано *, оставьте * эквивалент * и все в порядке :) – MariuszS

5

Порядок выполнения инициализатора блоков и инициализатора переменной задается в JLS § 12.5:

Непосредственно перед ссылкой на вновь созданный объект возвращается в качестве результата , указанный конструктор обрабатывается для инициализации нового объекта в следующем порядке:

[...]

-выполнять экземпляр инициализаторы и экземпляр инициализаторы переменной для данного класса, присвоение значения переменных экземпляра инициализаторов до соответствующего переменных, например, в слева-направо порядок, в котором они отображаются текстовыми в исходном коде для класса. [..]

Итак, блоки инициализатора и инициализаторы переменных выполняются в порядке их появления в исходном файле. Если вы переместите объявление переменной, int x = 1;, перед блоком инициализатора вы получите результат 2.

Технически, ваш Test класс компилируется в этом:

class TestClass { 
    int x; 

    public TestClass() { 
     super(); 
     x = 2; 
     x = 1; 
    } 
} 

Для фактического байткод вы можете запустить javap -c команду.

1

Потому что он будет скомпилирован To:

class TestClass { 
    int x; 

    TestClass(){ 
     this.x = 2; 
     this.x = 1; 
    } 
} 
Смежные вопросы