Dies wird als Instanzinitialisierer bezeichnet. Der Code im Initialisierer wird eingefügt nach der Aufruf an den Superklassenkonstruktor und vor der Rest des Konstruktorcodes.
Die erste Operation eines Konstruktors ist das Aufrufen eines Superklassenkonstruktors. Wenn ein Konstruktor explizit aufgerufen wird, super(...)
, wird der angegebene Konstruktor verwendet. Wenn kein Konstruktor explizit aufgerufen wird, wird der Standardkonstruktor (ohne Argumente) in der Superklasse aufgerufen. Wenn kein solcher Konstruktor vorhanden ist, handelt es sich um einen Kompilierzeitfehler.
Nach diesem expliziten oder impliziten Konstruktoraufruf werden Instanzinitialisierer in der Reihenfolge aufgerufen, in der sie im Quellcode angezeigt werden (ja, Sie können mehrere Initialisierer haben).
Zur Veranschaulichung dieses Programm druckt im initialisiert
Another constructor
Init 1
Init 2
Test constructor
class Another {
Another() { System.out.println("Another constructor"); }
}
class Test extends Another {
public static void main(String[] args) { new Test(); }
{ System.out.println("Init 1"); }
Test() { System.out.println("Test constructor"); }
{ System.out.println("Init 2"); }
}
Die am häufigsten gesehen Anwendung der "double brace initialization" idiom, läuft, wo eine anonyme innere Klasse definiert ist, und eine Instanz erstellt und auf einmal konfiguriert.Hier ist ein recht häufiges Beispiel aus Swing-Programmierung:
JButton popupButton = new JButton(new AbstractAction("Popup") {
{
putValue(Action.SHORT_DESCRIPTION, "Popup a dialog");
}
@Override
public void actionPerformed(ActionEvent evt)
{
popup();
}
});
Dies könnte nützlich sein, wenn Sie mehrere Konstrukteure haben, und müssen einige Parameter lose Initialisierung in jedem Konstruktor auszuführen. Dies könnte in einem Initialisierungsblock berücksichtigt werden.
Ich habe mich schon eine Weile darüber gewundert, ich erinnere mich, dass ich das vor einer Weile gesehen habe ... weiß jemand, wie diese Struktur heißt? – SimonT
Es wird ein "Initialisierungsblock" genannt. Es wird eigentlich nur in jeden Konstruktor kopiert. – wchargin
Diese Frage kann doppelte Frage sein: http://StackOverflow.com/Questions/16128076/Instance-Initialization-Block-and-Subclasses –