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.