Итак мы создаем обьект и присваиваем ссылку на него определенной переменной. В одном из заданий в цикле мы создаем 50000 тысяч обьектов. В цикле я прописал Cat cat= new Cat();. Вопрос, а что в итоге получилось - 50000 тысяч обьектов с одним именем ? 50000 обьектов с одинаковыми переменными ?
Sunshine
19 уровень
Вопрос по обьектам
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Wladyslaw Java Developer Master
11 ноября 2019, 19:18
одна ссылка - которая ссылается на последний созданный объект и 49999 объектов которые убрал сборщик мусора ну или совсем скоро уберет. Если ссылка объявлена до цикла, иначе - вообще ничего. А может и не уберет и память, которую они занимали освободится после окончания работы JVM.
Ссылочная переменная - это просто хранилище ссылки на объект в хипе.
Ее тип определяет доступные методы и т.д., но переменная, которая находится обычно в стеке или же в пермгене, хотя после 8-й джавы пермген заменили на метаспейс и я не до конца разобрался как там все устроенно, это если о ХотСпоте говорить, конечно, вот она хранит просто ссылку на объект и ничего более. Как устроена ссылка - тоже зависит от реализации виртуальной машины, но это нас и не интересует, в общем. Просто через ссылочную переменную мы можем обратится к объекту - это нам гарантируют.
Не читал что там Justinian написал - но думаю примерно то же самое 🧐
0
Justinian Judge в Mega City One Master
9 ноября 2019, 15:24
По окончанию работы цикла у тебя не будет ничего. Поскольку переменные имеют свою область видимости, в рамках которой они существуют, эта область видимости ограничивается блоком кода (фигурными скобками) в рамках которого эти переменные объявляются.
Поэтому переменные объявленные в одном методе не видны во втором. Переменные объявленные нельзя просто так использовать во втором. Тоже самое касается циклов или условных операторов.
Поэтому в коде выше, каждую итерацию будет объявляться переменная типа Cat с именем cat, заново и заново будет создаваться переменная с этим именем, старые будут в jvm уничтожатся.
Также будет создаваться новый объект типа Cat, ссылка в памяти на который будет присваиваться этой 50 000 раз перезатираемой ссылочной переменной. Но после каждой итерации и каждого очередного перезатирания, объект в памяти будет становится бесхозным.
Например.
Первая итерация цикла.
Cat cat = new Cat(); создается новый объект типа Кот, возвращается ссылка на него в памяти, пусть это будет AA251; Переменная типа Cat объявляется с именем cat и ей присваивается ссылка на нашего кота , это АА251.
после окончания первой итерации, переменная типа Cat с именем cat уходят в небытие.
После этого наступает ситуация, когда наш конкретный объект в памяти с адресом AA251, становится бесхозным, объект существует, а переменной которая указывает на него и хранит ссылку, - отсутствует. Значит этот объект уже для нас потерян, как ты сможешь обратно его привязать? Если не имеешь на него ссылки? Сборщик мусора такое удалит за ненадобностью.
Вторая итерация.
Наша переменная объявляется снова с тем же именем и типом.
Переменная ссылочного типа Cat.
Имя переменной cat.
Создается новый объект типа Кот, с адресом пусть 234AB. Дальше все то же самое,
по завершению итерации, переменная уничтожается, объект бесхозный и тоже умирает.
+1
Justinian Judge в Mega City One Master
9 ноября 2019, 15:31
Так что результат работы подобного кода - 50 000 мертвых котиков :(
Главное понять, что переменная это лишь контейнер для ссылки. Если объявляется переменная, это значит что резервируется область памяти, где указывается тип - Кот. указывается имя, cat. И значение переменной ссылочного типа - это собственно ссылка на объект. Например 234AB.
И когда ты пишешь в коде cat.meaow();
то это не значит что компилятор подгружает переменную cat, внутри которой есть объект. Нет.
JVM или компилятор обращается к переменной cat, достает там адрес - ссылку на объект, и отправляется по этому адресу, в область памяти, где хранится объект. И там уже будет искать внутри объекта информацию какие там у него методы, где они находятся, загружать эти методы, выполнять и тд.
Но переменная хранит лишь ссылку на объект. Причем вот так:
это значит что объект - 1 (один) шт. Ссылочных переменных три.
И все они содержат значение - это адрес ссылки на наш 1 (один) объект).
И как ты понимаешь, ссылка будет одинакова.
Это как один телевизор, и три пульта к нему. +1
VladimirMaster
9 ноября 2019, 12:38
Напиши задание и приведи пример своего решения.
0
Zhenya Kononov
9 ноября 2019, 11:54
Похоже, что да, но я там понимаю, что их потом сборщик мусора приберет, если ты их не будешь использовать.
Есть область видимости переменных, переменные, объявленные в цикле, как я помню, живут до окончания цикла.
0