2013-04-05 2 views
9

Wydaje się intuicyjnie jasne, że w Javie instance variable intitializers są wykonywane w kolejności, w jakiej pojawiają się w deklaracji klasy.Zamawianie inicjalizatorów zmiennych instancji

Z pewnością wydaje się, że tak jest w przypadku JDK, którego używam. Na przykład, następujący:

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(); 
    } 
} 

wydruki 42 0 42 (innymi słowy, y podnosi wartość domyślną z).

Czy to zamówienie jest rzeczywiście gwarantowane? Przeglądałem JLS i nie mogę znaleźć żadnego wyraźnego potwierdzenia.

+3

w czasie, gdy przypisano 'y',' z' nie jest jeszcze inicjowane, dlatego pokazuje '0'. – Raptor

+3

@ShivanRaptor: To jest dokładnie moja intuicja. Pytanie brzmi, czy jest to formalnie określone przez JLS. – NPE

Odpowiedz

6

Tak, jest.

SE7 JLS obejmuje instancji zmiennej kolejności inicjalizacji w sekcji 12.5 Execution:

...
4. Wykonaj inicjatorów instancji i zmiennej instancji inicjalizatory tej klasie, przypisanie wartości zmiennej instancji inicjalizatorów do odpowiednich zmiennych instancji w kolejności od lewej do prawej, w której występują one w kodzie źródłowym dla klasy. Jeśli wykonanie któregokolwiek z tych inicjalizatorów spowoduje wyjątek , nie są przetwarzane żadne dalsze inicjalizatory, a procedura kończy się nagle z tym samym wyjątkiem. W przeciwnym razie, przejdź do kroku 5.
...

the JLS for Java 5 wspomina w sekcji "klas":

inicjalizatory statyczne i klasy zmiennej inicjalizatory są wykonywane w celu tekstowej.

+0

To wszystko, dziękuję. – NPE

0

tak inicjalizacja zmiennych w klasie odbywa się w tej samej kolejności. Tak więc w drugiej linii y przyjmuje domyślną wartość o z, ponieważ z nie jest inicjowane