2013-04-05 2 views
9

Кажется интуитивно понятным, что в Java instance variable intitializers выполняются в том порядке, в котором они появляются в объявлении класса.Порядок инициализаторов переменных экземпляра

Это, безусловно, имеет место в JDK, который я использую. Так, например, следующее:

public class Clazz { 
    int x = 42; 
    int y = this.z; 
    int z = this.x; 
    void print() { 
     System.out.printf("%d %d %d\n", x, y, z); 
    } 
    public static void main(String[] args) { 
     new Clazz().print(); 
    } 
} 

отпечатки 42 0 42 (другими словами, y поднимает значение по умолчанию z).

Действительно ли этот заказ гарантирован? Я просматривал JLS и не могу найти явного подтверждения.

+3

в момент присвоения 'y',' z' по-прежнему не инициализирован, поэтому отображается '0'. – Raptor

+3

@ShivanRaptor: Это именно моя интуиция. Вопрос в том, формально ли это определено JLS. – NPE

ответ

6

Да, это так.

SE7 JLS охватывает экземпляр переменной порядок инициализации в 12.5 Execution разделе:

...
4. Выполните экземпляр инициализаторы и экземпляр инициализаторы переменной для данного класса, присвоение значения переменного экземпляра инициализаторах к соответствующим переменным экземпляра в порядке слева направо, в котором они отображаются текстовым образом в исходном коде для класса. Если выполнение любого из этих инициализаторов приводит к исключению , то никаких последующих инициализаторов не обрабатываются, и эта процедура завершается внезапно с тем же исключением. В противном случае, перейдите к шагу 5.
...

the JLS for Java 5 упоминает в разделе «Классы»:

Статические инициализаторы и инициализаторы переменных класса выполняются в текстовом порядке.

+0

Вот оно, спасибо. – NPE

0

Да инициализация переменных в классе выполняется в том же порядке. Таким образом, во второй строке y принимает значение o по умолчанию z, поскольку z не инициализируется.

Смежные вопросы