W języku Java niedozwolone jest odwoływanie się do zmiennej klasy przed jej zadeklarowaniem, o ile nie jest to jej inicjowanie. Java uruchomi inicjalizatory w klasie w kolejności tekstowej.
Section 12.4.2 of the JLS stany:
Następnie wykonać zarówno klasy zmiennej inicjatorów i statycznych inicjatorów klasy lub inicjatorów dziedzinie interfejsu w celu tekstowej, tak jakby były one pojedynczym bloku.
Section 8.3.3 of the JLS stany:
Zastosowanie zmiennych klasowych, których deklaracje pojawiają tekstowo po stosowanie jest ograniczone czasem, choć te są zmienne w zakresie klasy (§6.3). W szczególności, jest to błąd kompilacji, jeśli wszystkie następujące warunki są prawdziwe:
Deklaracja zmiennej klasy w klasy lub interfejsu C wydaje tekstowo po wykorzystaniu zmiennej klasy;
Użycie jest prostą nazwą w inicjalizatorze zmiennych klasy C lub statycznym inicjalizatorze C;
Użycie nie znajduje się po lewej stronie zadania;
C jest najgłębszą klasą lub interfejsem zamykającym użycie.
Wszystkie one są prawdziwe. Deklaracja pojawia się po użyciu w a=b;
. Jest w statycznym inicjalizatorze. Nie jest po lewej stronie zadania i jest najgłębszą (jedyną) klasą.
Najprostszym sposobem skompilowania jest przeniesienie deklaracji nad statycznym inicjatorem w kodzie źródłowym.
Co ciekawe, zastąpienie a=b;
przez a=L.b;
również doprowadzi do kompilacji, ponieważ odniesienie do b
nie jest już "proste".