Ok, ora mi sono ricordato, mi ricordavo la regola del forward reference.
Lo segno qui, così può essere utile:
Questo è legale e corretto:
codice:public class Prova { private static int svar1; static { svar1 = 10; svar2 = 20; } private static int svar2; public static void main(String[] args) { System.out.println(svar1); System.out.println(svar2); } }
Stampa 10 e 20.
Se però svar2 ha una inizializzazione:
codice:public class Prova { private static int svar1; static { svar1 = 10; svar2 = 20; } private static int svar2 = 100; // Inizializzazione public static void main(String[] args) { System.out.println(svar1); System.out.println(svar2); } }
allora l'assegnamento svar2 = 20; è inutile, poiché l'inizializzazione a 100 avviene comunque DOPO. Pertanto stampa 10 e 100.
Quello che è illegale (e dà errore) è un forward reference (non qualificato):
codice:public class Prova { private static int svar1; static { svar1 = svar2; } private static int svar2 = 10; public static void main(String[] args) { System.out.println(svar1); System.out.println(svar2); } }
Su svar1 = svar2; il javac segnala l'errore "illegal forward reference". Ovvero così non può accedere ad una variabile che è testualmente dopo.
Se però qualifichi l'uso di svar2 con il nome della classe:
Allora per il compilatore è lecito e compila. Ma poi a runtime a svar1 viene assegnato 0, perché in quel momento svar2 è ancora a 0, la inizializzazione a 10 avverrà solo DOPO.codice:public class Prova { private static int svar1; static { svar1 = Prova.svar2; // svar2 qualificato } private static int svar2 = 10; public static void main(String[] args) { System.out.println(svar1); System.out.println(svar2); } }

Rispondi quotando