
Originariamente inviata da
andbin
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:
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);
}
}
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.