我的文字要求我计算对象的引用。在给定代码内部如下:
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]
引用变量?
答案 0 :(得分:2)
Java类型系统的关键区别在于值语义和引用语义:当您说x = y;
时,值被复制< / em>,引用是别名的。
原始类型(如int
)具有值语义;类类型和数组具有引用语义。因此,当您说b1.beeHA = ha;
时,您将对数组的引用添加别名,也就是说现在ha
和b1.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。