On peut écrire des blocs d'initialisations qui seront exécutés au chargement de la classe en mémoire (blocs d'initialisation statique)
ou à la création d'une instance de la classe (blocs d'initialisation).
Exemple:
package com.mtitek.initializerBlock;
class ClassA {
// initializer block
{
System.out.println("initializer block (1)");
}
// static initialization block
static {
System.out.println("static initialization block (1)");
}
// constructor
ClassA() {
System.out.println("constructor: ClassA()");
}
// static initialization block
static {
System.out.println("static initialization block (2)");
}
// initializer block
{
System.out.println("initializer block (2)");
}
}
public class TestClass {
public static void main(String[] args) {
// Chargement de la classe ClassA
try {
Class.forName("com.mtitek.initializerBlock.ClassA");
} catch (ClassNotFoundException e) { }
System.out.println();System.out.println();
// Création d'une instance de la classe ClassA
new ClassA();
}
}
Résultat d'exécution du code :
static initialization block (1)
static initialization block (2)
initializer block (1)
initializer block (2)
constructor: ClassA()
Les blocs d'initialisation (comme c'est le cas pour les constructeurs) ne sont pas héritables.
-
Blocs d'initialisation statiques :
Le code des blocs d'initialisation statiques de la superclasse est toujours exécuté en premier
puis le code des blocs d'initialisation statiques de la sous-classe est exécuté ensuite.
-
Blocs d'initialisation (non-statiques) :
Puisque le code des blocs d'initialisation est copié dans chaque constructeur, l'exécution des blocs dépond de l'exécution des constructeurs.
Exemple:
package com.mtitek.initializerBlock;
class SuperClass {
// initializer block
{
System.out.println("SuperClass: initializer block (1)");
}
// static initialization block
static {
System.out.println("SuperClass: static initialization block (1)");
}
// constructor
SuperClass() {
System.out.println("constructor: SuperClass()");
}
}
class SubClass extends SuperClass {
// initializer block
{
System.out.println("SubClass: initializer block (1)");
}
// static initialization block
static {
System.out.println("SubClass: static initialization block (1)");
}
// constructor
SubClass() {
super();
System.out.println("constructor: SubClass()");
}
}
public class TestClass {
public static void main(String[] args) {
// Chargement de la classe SubClass
try {
Class.forName("com.mtitek.initializerBlock.SubClass");
} catch (ClassNotFoundException e) { }
System.out.println();System.out.println();
// Création d'une instance de la classe SubClass
new SubClass();
}
}
Résultat d'exécution du code :
SuperClass: static initialization block (1)
SubClass: static initialization block (1)
SuperClass: initializer block (1)
constructor: SuperClass()
SubClass: initializer block (1)
constructor: SubClass()