Массив ссылочных переменных - PullRequest
1 голос
/ 31 января 2012

Мой текст попросил меня сосчитать ссылки на объект. Внутри данного кода было следующее:

Honey honeypot = new Honey();

Honey [ ] ha = {honeypot, honeypot, honeypot, honeypot};

Bees b1 = new Bees();

b1.beeHA = ha;

, где конструктор для Bees создает массив Honey[ ] beeHA.

Теперь я подумал, что beeHA теперь будет содержать ссылку honeypot в четырех позициях, как и массив ha, и что это будут четыре отдельные ссылки плюс четыре из массива ha, создающих восемь ссылок. Но диаграмма, которую книга дает в качестве ответа, говорит, что массив beeHA указывает только на массив ha, а не на объект, на который ссылается ссылочная переменная honeypot, делая только четыре ссылки. Я правильно об этом думаю?

Если бы массив ha собирался собирать мусор (тема главы), не было бы в b1.beeHA[x] ссылочной переменной honeypot?

Ответы [ 3 ]

2 голосов
/ 31 января 2012

Принципиальное различие в системе типов Java заключается в семантике значений и ссылочной семантике : когда вы говорите x = y;, тогда значения копируются , и ссылки псевдонимы .

Примитивные типы (например, int) имеют семантику значений; Типы классов и массивы имеют ссылочную семантику. Поэтому, когда вы говорите b1.beeHA = ha;, вы указываете псевдоним ссылку на массив, то есть теперь и 1014 *, и b1.beeHA ссылаются на один и тот же массив.

Сборщик мусора не будет собирать массив, пока есть ссылки на него.

1 голос
/ 31 января 2012

ha это не массив - это переменная. Значение переменной является ссылкой на массив - как и значение b1.beeHA. Поэтому не имеет смысла говорить о том, что «массив ha» - сборщик мусора. Когда вы пишете:

b1.beeHA = ha;

, который просто копирует значение ha в b1.beeHA. Это не копирование массива - это просто копирование ссылки.

Код, который вы показали, создает один массив, содержащий четыре ссылки на один экземпляр Honey. Есть две ссылки на этот массив - одна в переменной ha и одна в переменной b1.beeHA.

0 голосов
/ 31 января 2012

Ваш пример немного запутан без большего контекста;Я не вижу области видимости ни для одной из этих переменных.

Объект не будет собирать мусор, если есть объект, содержащий ссылку на него.Ссылка на honeypot указывает на новый экземпляр Honey;так же как и массив ха.Экземпляр b1 указывает на массив ha.

Если вы рисуете граф объектов, экземпляр b1 указывает на ha, что указывает на honeypot.

Если b1 является сборщиком мусора, тогда весь граф является приемлемым.

Экземпляр Honey не будет иметь GC, пока b1 и ha находятся рядом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...