В чем смысл этого блока кода в java?
В чем смысл создания такого кода в Java? Существует ли это по какой-то определенной причине или это просто побочный результат других решений Java-дизайна? Разве вы не можете использовать конструирующее средство для достижения того же эффекта?
class Student
{
{
System.out.println("Called when Student class is instantiated.");
}
}
Ответы
Ответ 1
Один момент состоит в том, что он выполнит любой вызывающий конструктор. Если у вас есть несколько конструкторов, и они не звонят друг другу (по какой-либо причине, например, каждый из них хочет вызвать непосредственно соответствующий конструктор суперкласса), это один из способов убедиться, что один и тот же код выполняется для всех конструкторов, не помещая его в метод, который можно было бы назвать в другом месте.
Это также полезно при написании анонимного класса - вы не можете написать конструктор, но вы можете написать блок инициализатора. Я видел, что это использовалось для тестов JMock, например.
Ответ 2
Он назвал блок инициализации .
Компилятор Java копирует блоки инициализации в каждый конструктор. Поэтому этот подход может использоваться для совместного использования блока кода между несколькими конструкторами.
Ответ 3
Он называется блоком init. В таком блоке вы можете выполнять логику, которая одинакова для всех конструкций, вы также можете разделять объявление и инициализацию тех же полей.
upd и, конечно, двойная инициализация скобок, например
List<Integer> answers = new ArrayList<Integer>(){{add(42);}}
Ответ 4
Это блок инициализации. Как упоминалось Matt Ball, они копируются в каждый конструктор.
Вам может быть интересно узнать о статических инициализационных блоках (также в разделе ):
public class Foo {
static {
System.out.println("class Foo just got initialized!");
}
{
System.out.println("an instance of Foo just got initialized!");
}
}