Инициализатор экземпляра
Инициализатор экземпляра - это специальный блок кода внутри класса,
который заключается в фигурные скобки { } и не имеет имени.
Он выполняется автоматически при создании каждого нового объекта
класса, непосредственно перед выполнением кода конструктора.
Инициализатор экземпляра используется для общей инициализации полей,
когда нужно выполнить одинаковые действия для всех конструкторов класса.
Если в классе объявлено несколько инициализаторов экземпляра,
они выполняются в порядке их следования в исходном коде.
Инициализаторы экземпляра не могут содержать return
с возвращаемым значением, но могут содержать return без значения,
что приведёт к преждевременному завершению блока.
Синтаксис
public class MyClass
{
{
// instance initializer code
}
}
Пример
Давайте создадим класс с инициализатором экземпляра, который заполняет список значениями при создании объекта:
import java.util.List;
import java.util.ArrayList;
public class Main
{
public static void main(String[] args)
{
MyClass obj = new MyClass();
System.out.println(obj.getList());
}
}
class MyClass
{
private List<String> list = new ArrayList<>();
{
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
}
public List<String> getList()
{
return list;
}
}
Результат выполнения кода:
[a, b, c, d, e]
Пример
Давайте рассмотрим порядок выполнения инициализатора экземпляра и конструктора. Инициализатор выполняется перед конструктором:
public class Main
{
public static void main(String[] args)
{
MyClass obj = new MyClass();
System.out.println(obj.getValue());
}
}
class MyClass
{
private int value;
{
System.out.println("Initializer block");
value = 10;
}
public MyClass()
{
System.out.println("Constructor");
value = value + 5;
}
public int getValue()
{
return value;
}
}
Результат выполнения кода:
Initializer block
Constructor
15
Пример
Давайте создадим класс с несколькими инициализаторами экземпляра. Они выполняются в порядке объявления:
import java.util.List;
import java.util.ArrayList;
public class Main
{
public static void main(String[] args)
{
MyClass obj = new MyClass();
System.out.println(obj.getList());
}
}
class MyClass
{
private List<Integer> list = new ArrayList<>();
{
list.add(1);
list.add(2);
}
{
list.add(3);
list.add(4);
list.add(5);
}
public List<Integer> getList()
{
return list;
}
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
Смотрите также
-
конструктор
constructor,
который вызывается при создании объекта -
статический инициализатор
static init,
который выполняется при загрузке класса -
ключевое слово
static,
которое относится к классу, а не к экземпляру -
ключевое слово
this,
которое ссылается на текущий объект