Ceci est directement de http://www.programcreek.com/2011/10/java-class-instance-initializers/
1. Ordonnance d'exécution
Regardez la classe suivante, savez-vous laquelle est exécutée en premier?
public class Foo {
//instance variable initializer
String s = "abc";
//constructor
public Foo() {
System.out.println("constructor called");
}
//static initializer
static {
System.out.println("static initializer called");
}
//instance initializer
{
System.out.println("instance initializer called");
}
public static void main(String[] args) {
new Foo();
new Foo();
}
}
Production:
initialiseur statique appelé
initialiseur d'instance appelé
constructeur appelé
initialiseur d'instance appelé
constructeur appelé
2. Comment fonctionne l'initialiseur d'instance Java?
L'initialiseur d'instance ci-dessus contient une instruction println. Pour comprendre comment cela fonctionne, nous pouvons le traiter comme une déclaration d'affectation de variable, par exemple b = 0
. Cela peut rendre la compréhension plus évidente.
Au lieu de
int b = 0
, tu pourrais écrire
int b;
b = 0;
Par conséquent, les initialiseurs d'instance et les initialiseurs de variable d'instance sont à peu près les mêmes.
3. Quand les initialiseurs d'instance sont-ils utiles?
L'utilisation d'initialiseurs d'instance est rare, mais elle peut néanmoins être une alternative utile aux initialiseurs de variable d'instance si:
- Le code d'initialisation doit gérer les exceptions
- Effectuez des calculs qui ne peuvent pas être exprimés avec un initialiseur de variable d'instance.
Bien sûr, un tel code pourrait être écrit dans des constructeurs. Mais si une classe avait plusieurs constructeurs, vous devrez répéter le code dans chaque constructeur.
Avec un initialiseur d'instance, vous pouvez simplement écrire le code une fois, et il sera exécuté quel que soit le constructeur utilisé pour créer l'objet. (Je suppose que ce n'est qu'un concept et qu'il n'est pas souvent utilisé.)
Un autre cas dans lequel les initialiseurs d'instance sont utiles sont les classes internes anonymes, qui ne peuvent déclarer aucun constructeur du tout. (Est-ce que ce sera un bon endroit pour placer une fonction de journalisation?)
Merci à Derhein.
Notez également que les classes anonymes qui implémentent des interfaces [1] n'ont pas de constructeurs. Par conséquent, les initialiseurs d'instance sont nécessaires pour exécuter tout type d'expressions au moment de la construction.
public static void staticMethod(){}
, si vous exécutezTestStatic.class.getMethod("staticMethod");
. L'initialiseur statique ne sera pas appelé. Plus d'informations ici docs.oracle.com/javase/specs/jvms/se10/html/…