Это инициализатор экземпляра . Код в инициализаторе вставлен после вызов конструктора суперкласса и до остальная часть кода конструктора.
Первая операция любого конструктора заключается в вызове конструктора суперкласса. Если конструктор явно вызван, используется super(...)
, указанный конструктор. Если конструктор явно не вызывается, конструктор по умолчанию (без аргументов) вызывается в суперклассе. Если такой конструктор не существует, это ошибка времени компиляции.
После этого явного или неявного вызова конструктора инициализаторы экземпляра вызывают в том порядке, в котором они появляются в исходном коде (да, у вас может быть несколько инициализаторов).
Чтобы проиллюстрировать, работает программа печатает
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"); }
}
Наиболее часто встречается приложение в инициализационные "double brace initialization" idiom,, где определяется анонимный внутренний класс и экземпляр создается и конфигурируется сразу.Вот довольно распространенный пример из свинг программирования:
JButton popupButton = new JButton(new AbstractAction("Popup") {
{
putValue(Action.SHORT_DESCRIPTION, "Popup a dialog");
}
@Override
public void actionPerformed(ActionEvent evt)
{
popup();
}
});
Это может быть полезно, если у вас есть несколько конструкторов, и необходимо выполнить некоторые без параметров инициализации в конструкторе. Это можно было бы включить в блок инициализации.
Я уже некоторое время размышлял об этом, я помню, что видел это некоторое время назад ... кто-нибудь знает, что называется этой структурой? – SimonT
Он называется «блок инициализатора». На самом деле это просто скопировано в каждый конструктор. – wchargin
Этот вопрос может быть дублирующимся вопросом: http://stackoverflow.com/questions/16128076/instance-initialization-block-and-subclasses –