2014-07-22 14 views
27
class Hello12 { 
    static int b = 10; 
    static { 
     b = 100; 
    } 
} 

class sample { 
    public static void main(String args[]) { 
     System.out.println(Hello12.b); 
    } 
} 

Po uruchomieniu powyższego kodu wynik wynosi 100, ponieważ po wywołaniu klasy Hello blok statyczny wykonywany jest najpierw, ustawiając wartość b do 100 i wyświetlając ją. Ale gdy piszę ten kod:Klasy Java i bloki statyczne

class Hello12 { 
    static { 
     b = 100; 
    } 
    static int b = 10; 
} 

class sample { 
    public static void main(String args[]) { 
     System.out.println(Hello12.b); 
    } 
} 

Tutaj wyjście jest jako 10. Oczekuję odpowiedzi jako 100, ponieważ po statyczny blok jest wykonywany dała b wartość jako 100. Więc kiedy w main(), Nazwałem Hello.b powinien odnosić się do b (= 100). W jaki sposób pamięć jest przypisana do b w obu kodach?

+3

+1. W praktyce użyj 'final'. – djechlin

Odpowiedz

49

W „Szczegółowe procedury inicjalizacji” dla klas, Section 12.4.2 of the JLS Zjednoczone:

Następnie wykonać zarówno klasy zmiennej inicjatorów i statycznych inicjatorów klasy lub inicjatorów dziedzinie interfejsu w celu tekstowej, jakby były pojedynczym blokiem.

Oznacza to, że to tak, jakby był to pierwszy przykład:

b = 10; 
b = 100; 

I drugi przykład to:

b = 100; 
b = 10; 

ostatniej zmiany przypisania "wygrywa", wyjaśniając swoje wyjście.

+9

To musi być zaakceptowana odpowiedź! –

+0

@kocko W porządku. Pomóżmy rgettmanowi odznaczyć [Populist] (http://stackoverflow.com/help/badges/62/populist). Niestety, oznacza to, że zaakceptowana odpowiedź musi mieć 10 upvotes ... – Justin

+5

Dlaczego kompiluje się, jeśli działa w "kolejności tekstowej"? Z pewnością "b" nie zostało zadeklarowane, gdy jest ustawione w bloku statycznym? – Holloway

4

Statyka jest oceniana w kolejności, w jakiej pojawiają się w programie.

16

Bloki statyczne i zmienne statyczne inicjowane są w kolejności występowania w źródle. Jeśli kod jest:

class Hello12 { 

    static int b = 10; 
    static { 
    b = 100; 
    } 

} 

Rezultatem jest 100.

6

Oprócz odpowiedzi na pytanie, w jaki sposób kod jest wykonywany w jakiej kolejności, jestem zgadywania także chcą wiedzieć, dlaczego statyczny blok może odnosić się do zmienną statyczną, która nie została jeszcze zadeklarowana/wykonana tekstowo.

Podczas section 12.4.2 of the JLS ma wyjaśnić, że bloki statyczne i zmienne statyczne są wykonywane w kolejności tekstowych, które pojawiają się, section 8.3.3 of the JLS wyjaśnia, kiedy można odwołać co i widać, że stan The use is not on the left hand side of an assignment; nie pozwalając statyczny blok w sekundę przykład odwoływania się do zmiennej statycznej, która nie ma tekstu w kolejności, która została zadeklarowana/wykonana jeszcze.