Une section dans JLS peut être trouvée: §12.4.2 .
Procédure d'initialisation détaillée:
9 Ensuite, exécutez soit les initialiseurs de variable de classe et les initialiseurs statiques de la classe, soit les initialiseurs de champ de l'interface, dans l'ordre textuel, comme s'il s'agissait d'un seul bloc, sauf que les variables de classe finales et les champs d'interfaces dont les valeurs sont compilées les constantes -time sont initialisées en premier
Ainsi, les trois variables statiques seront initialisées une par une dans l'ordre textuel.
Alors
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;
Si je change la commande en:
static int num1;
static int num2=0;
static A obj = new A();
Le résultat sera 1,1
.
Notez que le static int num1;
n'est pas un initialiseur de variable car ( §8.3.2 ):
Si un déclarateur de champ contient un initialiseur de variable, alors il a la sémantique d'une affectation (§15.26) à la variable déclarée, et: Si le déclarateur est pour une variable de classe (c'est-à-dire un champ statique), alors l'initialiseur de variable est évalué et l'affectation effectuée exactement une fois, lorsque la classe est initialisée
Et cette variable de classe est initialisée lorsque la classe est créée. Cela se produit en premier ( §4.12.5 ).
Chaque variable d'un programme doit avoir une valeur avant que sa valeur ne soit utilisée: chaque variable de classe, variable d'instance ou composant de tableau est initialisé avec une valeur par défaut lors de sa création (§15.9, §15.10): Pour l'octet de type, la valeur par défaut est zéro, c'est-à-dire la valeur de (octet) 0. Pour le type short, la valeur par défaut est zéro, c'est-à-dire la valeur de (short) 0. Pour le type int, la valeur par défaut est zéro, c'est-à-dire 0. Pour le type long, la valeur par défaut est zéro, c'est-à-dire 0L. Pour le type float, la valeur par défaut est zéro positif, c'est-à-dire 0,0f. Pour le type double, la valeur par défaut est zéro positif, c'est-à-dire 0,0d. Pour le type char, la valeur par défaut est le caractère nul, c'est-à-dire «\ u0000». Pour le type boolean, la valeur par défaut est false. Pour tous les types de référence (§4.3), la valeur par défaut est nulle.