Вопрос или проблема
финал публичный класс CRMS{
частный ArrayList<Автомобиль>автомобили;
частный ArrayList<Арендатор>арендаторы;
частный ArrayList<Транзакция>транзакции;
частный int carid;
частный int renterid;
публичный CRMS() {
автомобили = новый ArrayList<Автомобиль>();
арендаторы = новый ArrayList<Арендатор>();
транзакции = новый ArrayList<Транзакция>();
carid=1;
renterid=1;
}
публичный класс main {
публичный статический void main(String[] args) {
// TODO Автоматически сгенерированный метод
System.out.println("Привет, мир от программы GOAT программиста");
CRMS crms = новый CRMS();
В основном, я запутался в том, как массив автомобилей и массив арендаторов будут уничтожены, когда CRMS crms будет уничтожен сборщиком мусора. Предполагая, что в основном коде ничего нет.
Я ожидал, что объектные массивы/списки атрибутов будут уничтожены при уничтожении объекта crms. Однако мой TA (Ассистент преподавателя) сказал мне, что это не так. P.S. Может кто-нибудь также сказать, является ли такой способ создания списков объектов внутри конструктора составом или агрегацией.
Когда вы выполняете CRMS crms = новый CRMS()
, происходит две вещи:
- Выделение памяти в куче: Создается новый блок памяти в куче для хранения фактического
CRMS
объекта. - Ссылочная переменная в стеке: На стеке создается переменная с именем
crms
. Эта переменная действует как ссылка, храня адрес объекта CRMS в куче.
Думайте о куче как о зоне хранения, а о стеке как о наборе заметок, ссылающихся на предметы в этом хранилище.
Концептуально, ниже вы можете представить себе расположение памяти.
После завершения main()
:
Когда метод main()
завершит выполнение, ссылочная переменная crms
на стеке будет удалена. Это не означает, что объект CRMS сам по себе исчезает.
Концептуально, вы можете представить это следующим образом:
Сборщик мусора:
Java имеет встроенный механизм, называемый сборщиком мусора. Он периодически просматривает кучу, чтобы найти объекты, на которые больше нет ссылок из стека (например, переменная crms
после завершения main()
). Эти объекты затем очищаются, освобождая память для новых объектов.
Для более глубокого изучения сборки мусора вы можете обратиться к этому ресурсу: https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
Ответ или решение
Когда вы создаете объект класса CRMS
с помощью выражения CRMS crms = new CRMS()
, происходят два ключевых события:
- Выделение памяти в куче: создается новая область памяти в куче, где хранится реальный объект
CRMS
. - Ссылка на стек: создается переменная с именем
crms
на стеке. Эта переменная ссылается на адрес объектаCRMS
, который находится в куче.
Для лучшего понимания, представьте, что куча — это место хранения, а стек — это набор заметок, указывающих на предметы в этом хранилище.
После завершения main()
Когда метод main()
завершает выполнение, переменная ссылки crms
, находящаяся на стеке, удаляется. Это не означает, что сам объект CRMS
исчезает. Если в программе не осталось других ссылок на этот объект, он становится недоступным.
Сборщик мусора
Java включает встроенный механизм под названием Сборщик мусора (Garbage Collector). Он периодически просматривает кучу, чтобы найти объекты, на которые больше нет ссылок со стека (как в случае переменной crms
после завершения main()
). Эти объекты помечаются для удаления, и память, занимаемая ими, освобождается.
Уничтожение объектов-атрибутов
В классе CRMS
вы создаете три объекта типа ArrayList
— cars
, renters
, и transactions
— в конструкторе. Эти объекты будут уничтожены сборщиком мусора, если:
- Объект
CRMS
становится недоступным (что происходит, когдаmain()
завершается без других ссылок наcrms
). - Как только объект
CRMS
удаляется, все его атрибуты, такие какcars
,renters
, иtransactions
, больше не имеют ссылок, что делает их доступными для сборщика мусора.
Каждый из этих ArrayList
содержит ссылки на объекты Car
, Renter
, и Transaction
. Если нет других ссылок на эти коллекции из других частей программы, то они также будут удалены сборщиком мусора, когда CRMS
станет недоступным.
Таким образом, если CRMS
уничтожается, то все объекты, находящиеся в списках cars
, renters
, и transactions
, будут также подвержены垃圾-коллекции, если на них нет других ссылок в программе.
Композиция или агрегация
Что касается вопроса о том, является ли создание объектов списков внутри конструктора композиционным или агрегационным отношением, то в данном контексте это более похоже на композицию. Композиция предполагает, что части (в данном случае, ArrayList
) не могут существовать без целого (объекта CRMS
). Если экземпляр CRMS
будет уничтожен, все его элементы — включая списки cars
, renters
, и transactions
— также будут уничтожены. В агрегации части могут существовать независимо от целого, что здесь не наблюдается.
Заключение
В заключение, в Java сборщик мусора автоматически управляет уничтожением объектов, когда они больше не используются. Надеюсь, это объяснение проясняет ваши сомнения. Если у вас есть дополнительные вопросы, пожалуйста, не стесняйтесь задавать их.