参考变量数组

时间:2012-01-30 23:30:12

标签: java arrays garbage-collection

我的文字要求我计算对象的引用。在给定代码内部如下:

Honey honeypot = new Honey();

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

Bees b1 = new Bees();

b1.beeHA = ha;

Bees的构造函数创建Honey[ ] beeHA数组。

现在我认为beeHA现在将引用honeypot保存在四个位置,数组ha也是如此,这些引用将是四个单独的引用加上{{1}中的四个引用}数组制作八个引用。但是本书作为答案给出的图表说ha数组仅指向beeHA数组而不指向ha引用变量引用的对象,仅引用四个引用。我是否正确地考虑过这个问题?

如果要对数组honeypot进行垃圾回收(本章的主题),ha是否仍然包含b1.beeHA[x]引用变量?

3 个答案:

答案 0 :(得分:2)

Java类型系统的关键区别在于值语义引用语义:当您说x = y;时,值被复制< / em>,引用是别名的

原始类型(如int)具有值语义;类类型和数组具有引用语义。因此,当您说b1.beeHA = ha;时,您将对数组的引用添加别名,也就是说现在hab1.beeHA都引用了相同的数组。

垃圾收集器在仍有引用的情况下不会收集数组。

答案 1 :(得分:1)

ha不是数组 - 它是一个变量。变量的值是对数组的引用 - 与b1.beeHA的值一样。因此,谈论“数组ha”被垃圾收集真的没有意义。当你写:

b1.beeHA = ha;

只是将ha的值复制到b1.beeHA。它不是复制数组 - 它只是复制引用。

您显示的代码会创建一个数组,其中包含对Honey的一个实例的四个引用。有两个对该数组的引用 - 一个在变量ha中,另一个在变量b1.beeHA中。

答案 2 :(得分:0)

如果没有更多背景,你的例子会有点混乱;我无法看到任何这些变量的范围。

如果对象保持对它的引用,则不会对对象进行垃圾回收。蜜罐参考指向Honey的新实例; ha阵列也是如此。 b1实例指向ha数组。

如果绘制对象图,则b1实例指向ha,指向蜜罐。

如果b1被垃圾收集,则整个图表都符合条件。

只要b1和ha在附近,Honey实例就不会被GC。