2013-03-15 10 views
9

Jeden z moich znajomych zapytał mnie, który załaduje pierwszą zmienną statyczną lub blok statyczny.Która zostanie załadowana pierwsza zmienna statyczna lub blok statyczny?

Moja odpowiedź wskazuje na zmienną statyczną.

więc dał mi dwa równania i rzekł do rozróżnienia między nimi
pierwszego równania

public class Some { 
    public static void main(String args[]) 
    { 
     System.out.println(Some.x); 
    } 
    static { 
     System.out.println(Some.x); 
    } 
    static int x=90; 
} 

O/P: 0 90

Drugie równanie

public class Some { 
    public static void main(String args[]) 
    { 
     System.out.println(Some.x); 
    } 
    static int x=90; 
    static { 
     System.out.println(Some.x); 
    } 
} 

O/P: 90 90

Próbowałem dekompilować kod bajtowy i stwierdziłem, że jest taki sam dla obu powyższych równań. Pomóż mi je rozróżnić. Jestem zdezorientowany, kiedy zainicjowana zostanie zmienna statyczna.

+3

Rzeczy statyczne są wykonywane sekwencyjnie, w kolejności, w jakiej są zdefiniowane w klasie. –

+0

Czy na pewno kod bajtu jest taki sam? Spodziewałbym się, że deklaracje pojawią się w innej kolejności, a jak zaznacza @udhanshu, porządek deklaracji jest ważny. –

+0

@ PatriciaShanahan ya dla obu kodów bajt równania jest taka sama. – Hablu

Odpowiedz

1

zmienne statyczne i statyczne bloki są wykonywane w kolejności, w jakiej występują.

Oto pierwszy O/P: 0 90 jak w rachunku statycznego bloku wykonanego po statycznej zmiennej rachunku inicjującego static int x=90;

+0

Śmieci. Ciągłe składanie jest wykonywane przez kompilator, a nie przez JVM. JVM wykonuje inicjatory zmiennych statycznych i bloki w kolejności tekstowej, w jakiej pojawiają się w pliku źródłowym. Nie najpierw zmienne, a potem bloki. – EJP

+0

Edytowane, przepraszam za niedogodności i dzięki. –

-1

Zmienne statyczne są wykonywane, gdy JVM ładuje klasę System.out.println(Some.x);, a klasa jest ładowany gdy zostanie utworzona instancja lub zostanie wywołana jego statyczna metoda.

Statyczny blok inicjalizatora zostanie zainicjowany przed wywołaniem klasy lub przed wywołaniem jej statycznej metody, a nawet przed użyciem jej statycznej zmiennej.

-1

daję prosty przykład dla przepływu sterowania statyczne i instancji spożywcze:

Załóżmy, że masz 2 clases A i B. rozciąga klasy A do klasy B. i klasa B ma główne metody.Po udanej kompilacji zarówno polecenie cmd jest jak:

java B 

teraz co się stanie zobaczyć krok po kroku:

  1. Klasy A i B zostaną załadowane
  2. statyczne członkowie i bloki klasy Identyfikator A zostanie zidentyfikowany i będzie wykonywany kolejno kolejno (jeden po drugim) (ale tylko jeden raz w czasie ładowania klasy)
  3. statyczne elementy i bloki klasy B zostaną zidentyfikowane i wykonane (jeden po drugim) (ale tylko jeden raz w czasie zajęć ładowanie)
  4. główna metoda klasy B zostanie wywołana (w przypadku, gdy klasa B nie ma głównej metody, wówczas zostanie wywołana główna metoda klasy A)
  5. Jak tylko utworzysz obiekt klasy A: wszystko instancja członkowie inicjalizacji i wystąpienie wykonanie bloku nastąpi w klasy a
  6. konstruktor klasy a (który został użyty do utworzenia obiektu) będzie być wykonywane
  7. Jeśli utworzyć obiekt klasy B: wszystkie instancji Inicjowanie członków i wykonywanie bloków instancji zostanie wykonane w klasie A.
  8. konstruktor klasy A (domyślnego konstruktora lub innych jeśli nazwał go od konstruktora B.) będzie być wykonywane

  9. potem wszystko instancji członkowie inicjalizacji i wystąpienie wykonanie bloku nastąpi w klasy B

  10. a potem konstruktor klasy B (który został użyty do tworzenia obiektu) zostanie wykonany

Uwaga: członkowie statyczne i blokuje wykonanie jest wykonywany tylko jeden raz podczas ładowania klasy po raz pierwszy, podczas gdy członkowie instancji i bloki instancji są wykonywane za każdym razem, gdy tworzymy obiekt klasy. Proszę dać mi znać, jeśli nie mam racji.

+0

"Klasa A rozciąga się do klasy B" jest w najlepszym razie niejednoznaczna lub w najgorszym przypadku bezsensowna. Jeśli masz na myśli to, że A przedłuża B, większość twojej odpowiedzi jest błędna. – EJP

+0

Nie mogę cię złapać, wyjaśnij swój punkt widzenia. –

+0

Nie sądzę, że mogę. Wydaje mi się to już zupełnie jasne. Musisz wyjaśnić oświadczenie, które zacytowałem. – EJP