Это напрямую от http://www.programcreek.com/2011/10/java-class-instance-initializers/
1. Исполнение поручения
Посмотрите на следующий класс, знаете ли вы, какой класс выполняется первым?
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();
}
}
Выход:
статический инициализатор с именем
инициализатор экземпляра с именем
конструктор с именем
инициализатор экземпляра с именем
конструктор с именем
2. Как работает инициализатор экземпляра Java?
Приведенный выше инициализатор экземпляра содержит оператор println. Чтобы понять, как это работает, мы можем рассматривать его как оператор присваивания переменной, например, b = 0
. Это может сделать это более очевидным для понимания.
вместо
int b = 0
, вы можете написать
int b;
b = 0;
Следовательно, инициализаторы экземпляров и инициализаторы переменных экземпляров в значительной степени совпадают.
3. Когда инициализаторы экземпляра полезны?
Использование инициализаторов экземпляров встречается редко, но все же это может быть полезной альтернативой инициализаторам переменных экземпляров, если:
- Код инициализатора должен обрабатывать исключения
- Выполнять вычисления, которые не могут быть выражены с помощью инициализатора переменной экземпляра.
Конечно, такой код можно написать в конструкторах. Но если бы в классе было несколько конструкторов, вам пришлось бы повторять код в каждом конструкторе.
С помощью инициализатора экземпляра вы можете просто написать код один раз, и он будет выполняться независимо от того, какой конструктор используется для создания объекта. (Полагаю, это просто концепция, и она используется не часто.)
Другой случай, когда инициализаторы экземпляров полезны, это анонимные внутренние классы, которые вообще не могут объявлять никаких конструкторов. (Будет ли это хорошим местом для размещения функции регистрации?)
Благодаря Derhein.
Также обратите внимание, что у анонимных классов, которые реализуют интерфейсы [1], нет конструкторов. Поэтому инициализаторы экземпляров необходимы для выполнения любых видов выражений во время построения.