Это прямо с 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], нет конструкторов. Поэтому инициализаторы экземпляров необходимы для выполнения любых видов выражений во время построения.
public static void staticMethod(){}
, если вы выполняетеTestStatic.class.getMethod("staticMethod");
. Статический инициализатор не будет вызван. Более подробная информация здесь docs.oracle.com/javase/specs/jvms/se10/html/…