Powiel możliwe:
Why can’t enum’s constructor access static fields?Dlaczego enum Konstruktor nie może uzyskać dostępu polem statycznym
enum Test {
e1,e2;
int i=0;
static int j=5;
Test(){
System.out.println(i+" "+j);
}
}
W powyższym kodzie konstruktor może uzyskać dostęp do zmiennej instancji, ale nie statyczna zmienna J
Przeczytałem odpowiedź odnoszą się do innego autora wszyscy mówią e1 i e2 zainicjowane przed inicjalizacją J (pole statyczne), ale zgodnie ze specyfikacją java, wszystkie statyczne pola zostały zainicjowane, gdy tylko klasa załadowała się do pamięci, czyli przed uruchomieniem konstruktora. Tak więc przed uruchomieniem konstruktora Test() należy zainicjować zmienną statyczną j. Nie jestem w stanie zrozumieć ograniczenia, czy jakiekolwiek ciało mnie zrozumie. Przeczytałem już odpowiedź na pytania: Why can't enum's constructor access static fields? Ale nie jestem zadowolony z odpowiedzi w stylu: -Tworzenie jest wywoływane, zanim wszystkie statyczne pola zostały zainicjalizowane.
Załóżmy, że jeśli wziąć inny przykład z prostym klasy podobnego wyliczenia
class Test{
public static final Test t=new Test();
static int a=5;
Test(){
System.out.println(a);
}
public static void main(String[] args) {
}
}
Tu według tam argument konstruktora będzie działać przed inicjalizacji pola statycznego i to działa również jak to print 0 (Jak JVM zrobił inicjalizacja). Ale nie ma błędu kompilacji lub nie ma problemu z uruchomieniem. Dlaczego to samo nie dzieje się z enum.
Właściwie to dobre pytanie, nie mogłem zrozumieć, dlaczego tak jest. Może mieć coś z tym, jak kompilator Java kompiluje plik klasy. – Gerbrand
Nie jestem ekspertem od Java, ale czy nie są członkami enum ('e1' i' e2' powyżej) zasadniczo statycznymi członkami 'enum'? I jako takie, gdy * oni * są inicjowane wartościami, konstruktor musi zostać wywołany. Ale 'j' nie został jeszcze zainicjowany? –
Każda enum w Javie to * jak * klasa rozszerzająca 'java.lang.Enum'. Tego 'java.lang.Enum' nie można rozszerzyć o inne inne * normalne * klasy. Twój argument, że "prosta klasa, taka jak enum", daje oczekiwany wynik, jest nieprawidłowy. – Prasanth