Ответ
Хранение данных ссылочного типа разделено на две области памяти:
- Сам объект (его состояние, поля) всегда создается и хранится в куче (Heap).
- Переменная-ссылка (указатель на этот объект) хранится либо в стеке (Stack), если это локальная переменная, либо внутри другого объекта в куче, если это поле.
Пример:
public class ReferenceExample {
private Object fieldRef = new Object(); // 1. Объект Object в куче.
// 2. Ссылка fieldRef хранится в куче как часть экземпляра ReferenceExample.
public void method() {
Object localRef = new Object(); // 1. Объект Object в куче.
// 2. Ссылка localRef хранится в стеке (фрейме метода `method`).
}
}
Почему такая архитектура?
- Куча: Позволяет объектам существовать дольше, чем выполнение одного метода, и управляется сборщиком мусора (Garbage Collector).
- Стек: Обеспечивает быстрый аллокацию/освобождение памяти для локальных переменных и четкий контроль за временем жизни ссылок (уничтожаются при выходе из метода).