Kto może wyjaśnić, co się dzieje?Blokada statyczna nie jest wywoływana
public class MagicFinal {
public static void main(String[] args) {
System.out.println(A.s);
}
}
class A {
static {
System.out.println("class has been loaded");
}
public static final String s = "final";
public static final Integer i = 3;
}
konsoli:
końcowy
Co to jest? Nie rozumiem, dlaczego klasa nie została załadowana, wiem, że klasy zawsze ładują się przy pierwszym wywołaniu. Pole s
jest w puli ciągów, widzę, że ostateczny modyfikator jest magiczny.
Jeśli usunę ostateczny modyfikator (public static String s = "final"
) będę się
konsoli:
klasa została załadowana
ostateczną
Uwaga: Zmieniłem pola i
: public static final int i = 3;
i pokaż go w conso le. Dostałem to samo, co w sytuacji String. Czemu?
Dobrze, dziękuję! A co z int ?? publiczny statyczny finał int i = 3; // nie zapisano klasy został załadowany public static final Integer i = 3; // klasa zapisu została załadowana – idmitriev
Proszę przeczytać definicję wyrażenia stałego w czasie kompilacji, do którego podłączyłem w mojej odpowiedzi. 'int' jest wartością pierwotną,' String' jest jedynym przypadkiem specjalnej wartości referencyjnej, która może być zaangażowana w wyrażenie stałe, a 'Integer' nie jest ani. –
@marko - Czy mówisz mi, że klasa A w ogóle się nie ładuje ?? czy jest to przypadek leniwego inicjowania? – TheLostMind