Недавно я нашел то, что мне кажется новым синтаксисом для статической инициализации ArrayList:
new ArrayList() {{
add("first");
add("second");
}};
Мой вопрос: что там на самом деле происходит? Это ярлык для определения статического блока (я думал, что понадобится ключевое слово static
)? Или просто способ определить конструктор по умолчанию? Что-то другое? Какая версия Java стала действительной?
Объяснение плюс ссылка на дальнейшее чтение будет с благодарностью.
редактирование:
Мой тестовый класс, показывающий, выполняется ли блок инициализатора до или после конструктора, находится ниже. Результаты показывают, что блоки инициализатора выполняются перед другим кодом конструктора:
import org.junit.Test;
public class InitializerBlockTest {
class InitializerTest {
{
System.out.println("Running initalizer block");
}
public InitializerTest() {
System.out.println("Running default constructor");
}
}
class SubClass extends InitializerTest {
{
System.out.println("Running subclass Initializer block");
}
public SubClass() {
System.out.println("Running subclass constructor");
}
}
@Test
public void testIt() {
new SubClass();
}
}
Выход:
Running initalizer block
Running default constructor
Running subclass Initializer block
Running subclass constructor