2013-04-06 13 views
7

Podczas uzyskiwania dostępu do ostatecznej zmiennej statycznej z nazwą klasy, dlaczego blok statyczny nie jest przetwarzany w języku Java?Blok statyczny Nieprzetworzony w java

class Foo { 
    public static final int BAR; 
    static { 
    System.out.println("Hello"); 
    } 
    } 
class Baz { 
    public static void quux() { 
    System.out.println(Foo.BAR); 
    } 
} 

Odpowiedz

11

Będzie czasami - to zależy od tego, czy zmienna jest faktycznie stała:

  • To musi być łańcuch znaków lub zmienna prymitywny (ewentualnie każda inna klasa z wartość pusta; musiałem sprawdzić)
  • Wyrażenie inicjujące musi być stałym wyrażeniem

Jeśli tak jest, wszelkie odniesienia do zmiennej są skutecznie przekształcane w wartość. Więc w ten kod:

class Foo { 
    public static final int BAR = 5; 
} 

class Baz { 
    public static void quux() { 
     System.out.println(Foo.BAR); 
    } 
} 

Sposób Baz jest kompilowany do tego samego kodu jako:

public static void quux() { 
    System.out.println(5); 
} 

nie ma śladu Foo.BAR lewo w kodu bajtowego, dlatego Foo nie musi być zainicjowany kiedy metoda zostanie wykonana.

Jeśli chcesz temu zapobiec, zawsze po prostu nie inicjuj go ze stałym wyrażeniem w inicjalizatorze zmiennych. Na przykład:

class Foo { 
    public static final int BAR; 

    static { 
     BAR = 5; 
    } 
} 

class Baz { 
    public static void quux() { 
     System.out.println(Foo.BAR); 
    } 
} 

To byłoby na tyle, aby nie liczyć Foo.BAR jako stała ile kompilator jest zaniepokojony.

Powiązane problemy