Ответ
Оператор new инициирует процесс создания нового объекта в куче (heap) и возвращает ссылку на него.
Последовательность шагов:
- Проверка класса: Загрузчик классов (
ClassLoader) проверяет, загружен ли класс. Если нет — он загружается, связывается и инициализируется (выполняются статические блоки). - Выделение памяти: В куче выделяется непрерывный блок памяти, достаточный для хранения всех полей объекта (включая поля родительских классов) и служебной информации (заголовок объекта).
- Инициализация полей по умолчанию: Все поля инициализируются значениями по умолчанию (
0,false,null). - Выполнение инициализаторов и конструкторов:
- Выполняются инициализаторы полей и блоки инициализации экземпляра в порядке их объявления.
- Вызывается конструктор класса. Если в конструкторе есть
this(...)илиsuper(...), управление передаётся им. Цепочка конструкторов выполняется доObject.
- Возврат ссылки: После успешного выполнения конструктора в переменную, указанную слева от
=, присваивается ссылка на созданный объект.
Пример в деталях:
class Person {
private String name = "Unknown"; // Инициализатор поля
{ System.out.println("Initialization block"); } // Блок инициализации
public Person(String n) {
this.name = n; // Конструктор
}
}
Person p = new Person("Alice");
Что происходит:
- Выделяется память под
Person(включая полеname). - Поле
nameполучает значениеnull(по умолчанию). nameинициализируется как"Unknown".- Выполняется блок инициализации (печать).
- Вызывается конструктор
Person("Alice"), который присваивает полюnameзначение"Alice". - Ссылка на объект присваивается переменной
p.
Возможные ошибки:
OutOfMemoryError— если в куче нет достаточного непрерывного свободного места.- Исключение в конструкторе — объект считается несозданным, но память может быть собрана сборщиком мусора.