È possibile trovare una sezione in JLS: §12.4.2 .
Procedura di inizializzazione dettagliata:
9.Poi, esegui gli inizializzatori delle variabili di classe e gli inizializzatori statici della classe, o gli inizializzatori dei campi dell'interfaccia, in ordine testuale, come se fossero un blocco unico, tranne che le variabili di classe finali ei campi delle interfacce i cui valori sono compilati -Le costanti di tempo vengono inizializzate per prime
Quindi le tre variabili statiche verranno inizializzate una ad una in ordine testuale.
Così
static A obj = new A();
//num1 = 1, num2 = 1;
static int num1;
//this is initilized first, see below.
static int num2=0;
//num1 = 1, num2 = 0;
Se cambio l'ordine in:
static int num1;
static int num2=0;
static A obj = new A();
Il risultato sarà 1,1
.
Notare che static int num1;
non è un inizializzatore di variabili perché ( §8.3.2 ):
Se un dichiaratore di campo contiene un inizializzatore di variabile, allora ha la semantica di un assegnamento (§15.26) alla variabile dichiarata e: Se il dichiaratore è per una variabile di classe (cioè un campo statico), l'inizializzatore di variabile è valutata e l'assegnazione eseguita esattamente una volta, quando la classe viene inizializzata
E questa variabile di classe viene inizializzata quando viene creata la classe. Questo accade per primo ( §4.12.5 ).
Ogni variabile in un programma deve avere un valore prima che il suo valore venga utilizzato: Ogni variabile di classe, variabile di istanza o componente di array viene inizializzata con un valore predefinito quando viene creata (§15.9, §15.10): per il tipo byte, il valore predefinito è zero, cioè il valore di (byte) 0. Per il tipo short, il valore predefinito è zero, ovvero il valore di (short) 0. Per il tipo int, il valore predefinito è zero, ovvero 0. Per il tipo long, il valore predefinito è zero, ovvero 0L. Per il tipo float, il valore predefinito è zero positivo, ovvero 0,0f. Per il tipo double, il valore predefinito è zero positivo, ovvero 0,0d. Per il tipo char, il valore predefinito è il carattere null, ovvero "\ u0000". Per il tipo booleano, il valore predefinito è false. Per tutti i tipi di riferimento (§4.3), il valore predefinito è nullo.