Dies ist direkt von http://www.programcreek.com/2011/10/java-class-instance-initializers/
1. Vollstreckungsbescheid
Sehen Sie sich die folgende Klasse an. Wissen Sie, welche zuerst ausgeführt wird?
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();
}
}
出力します。
statischer Initialisierer namens
Instanz-Initialisierer namens
Konstruktor genannt
Instanz-Initialisierer namens
Konstruktor genannt
2. Wie funktionieren die Java-Instanzinitialisierungen?
Der obige Instanzinitialisierer enthält eine println-Anweisung. Um zu verstehen, wie sie funktioniert, können wir sie wie eine Variablenzuweisungsanweisung behandeln, z. B., b = 0
. Dies kann das Verständnis erleichtern.
Anstelle von
int b = 0
könnten Sie schreiben
int b;
b = 0;
Daher sind Instanzinitialisierer und Instanzvariableninitialisierer so gut wie identisch.
3. Wann sind Instanzinitialisierungen sinnvoll?
Die Verwendung von Instanzinitialisierern ist selten, aber dennoch kann sie eine nützliche Alternative zu Instanzvariableninitialisierern sein, wenn:
- Initialisierungscode muss Ausnahmen behandeln
- Führen Sie Berechnungen durch, die nicht mit einem Instanzvariableninitialisierer ausgedrückt werden können.
Natürlich könnte ein solcher Code in Konstruktoren geschrieben werden. Aber wenn eine Klasse mehrere Konstruktoren hat, müssten Sie den Code in jedem Konstruktor wiederholen.
Mit einem Instanzinitialisierer können Sie den Code nur einmal schreiben, und er wird unabhängig davon ausgeführt, welcher Konstruktor zur Erstellung des Objekts verwendet wird. (Ich schätze, das ist nur ein Konzept, das nicht oft verwendet wird).
Ein weiterer Fall, in dem Instanzinitialisierer nützlich sind, sind anonyme innere Klassen, die überhaupt keine Konstruktoren deklarieren können. (Ist dies ein guter Platz für eine Protokollierungsfunktion?)
Dank an Derhein.
Beachten Sie auch, dass anonyme Klassen, die Schnittstellen [1] implementieren, keine Konstruktoren haben. Daher werden Instanzinitialisierer benötigt, um alle Arten von Ausdrücken zur Konstruktionszeit auszuführen.