L'ordre général d'opérations d'initialisation est (après la classe est chargé et avant la première utilisation):
- Statique (de classe) de blocs de code afin qu'il apparaît dans le code,
- Objet de blocs de code afin qu'il apparaît dans le code (initialisation des blocs et des devoirs).
- Les constructeurs
Certes, je ne vous parle pas des constructeurs et des fonctions du corps comme un bloc de code ci-dessus .
Je ne sais pas comment à propos de final static
champs. On dirait qu'ils suivent les règles de static
champs et ils ne peuvent pas être référencées avant de déclaration en dépit de précédents commentaires qu'ils sont initialisés à l'étape de compilation. Si ils sont référencés à l'avant il y a une erreur de compilation:
Example.java:8: illegal forward reference
System.err.println("1st static block j=" + j);
Peut-être final static
champs peuvent être initialisés et compilé dans le fichier de classe mais ce n'est pas une règle générale, et ils ne peuvent toujours pas être référencé avant de déclaration.
Exemple de code pour vérifier l'ordre d'initialisation:
class Example {
final static int j = 5;
{
System.err.println("1st initializer j=" + j);
}
static {
System.err.println("1st static block j=" + j);
}
static {
System.err.println("2nd static block j=" + j);
}
final static java.math.BigInteger i = new java.math.BigInteger("1") {
{
System.err.println("final static anonymous class initializer");
}
};
Example() {
System.err.println("Constructor");
}
static {
System.err.println("3nd static block j=" + j);
}
{
System.err.println("2nd initializer");
}
public static void main(String[] args) {
System.err.println("The main beginning.");
Example ex = new Example();
System.err.println("The main end.");
}
}
Le code ci-dessus snipset impressions:
1st static block j=5
2nd static block j=5
final static anonymous class initializer
3nd static block j=5
The main beginning.
1st initializer j=5
2nd initializer
Constructor
The main end.