Kiedy są inicjalizowane pola statyczne? Jeśli nigdy nie utworzę instancji klasy, ale mam dostęp do pola statycznego, to czy WSZYSTKIE bloki statyczne i prywatne metody statyczne używane do tworzenia instancji prywatnych pól statycznych są w tej chwili wywoływane (w kolejności)?
A jeśli wywołam metodę statyczną? Czy obsługuje również wszystkie statyczne bloki? Przed metodą?
java
static
initialization
Tony R.
źródło
źródło
Odpowiedzi:
Inicjalizacja statyczna klasy zwykle ma miejsce bezpośrednio przed pierwszym z następujących zdarzeń:
w przypadku klasy najwyższego poziomu wykonywana jest instrukcja assert zagnieżdżona leksykalnie w klasie1 .Zobacz JLS 12.4.1 .
Możliwe jest również wymuszenie inicjalizacji klasy (jeśli jeszcze nie została zainicjowana) przy użyciu
Class.forName(fqn, true, classLoader)
lub krótkiej formyClass.forName(fqn)
1 - Ostatni punkt znajdował się w JLS dla Java 6 do Java 8, ale najwyraźniej był to błąd specyfikacji. Ostatecznie został poprawiony w Java 9 JLS: patrz źródło .
źródło
String
są podstawiane i nie są do nich odwoływane. Jeśli odwołujesz się doclass Other { public static final int VAL = 10; }
jakiejś klasyMyClass { private int = Other.VAL; }
, klasaOther
nie zostanie załadowana. Zamiast tego kompilator po prostu podstawi ostatnie pole w czasie kompilacji.String
zmiennych „statyczny końcowy” , tylko te zainicjowane przez stałe wyrażenie.static
gdy jest to powszechny przypadek.Pola statyczne są inicjowane podczas „fazy” inicjalizacji ładowania klasy (ładowania, łączenia i inicjalizacji), która obejmuje statyczne inicjatory i inicjalizacje jej pól statycznych. Inicjatory statyczne są wykonywane w kolejności tekstowej zdefiniowanej w klasie.
Rozważmy przykład:
Plik Test.b jest drukowany,
null
ponieważ gdy wywołano elementsayHello
w zakresie statycznym, zmienna statycznaa
nie została zainicjowana.źródło
Tak, wszystkie statyczne inicjatory są uruchamiane przed pierwszym uzyskaniem dostępu do klasy. Gdyby było inaczej, nazwałbym to błędem.
źródło