java引用变量数组
我的文本要求我计算对一个对象的引用。给定代码中包含以下内容:
Honey honeypot = new Honey();
Honey [ ] ha = {honeypot, honeypot, honeypot, honeypot};
Bees b1 = new Bees();
b1.beeHA = ha;
其中Bees
的构造函数创建Honey[ ] beeHA
数组
现在我认为beeHA
将像数组ha
一样将引用honeypot
保存在四个位置,并且这将是四个独立的引用加上来自ha
数组的四个引用,形成八个引用。但是这本书给出的回答是beeHA
数组只指向ha
数组,而不指向honeypot
引用变量引用的对象,该引用变量只进行了四次引用。我想得对吗
如果数组ha
被垃圾收集(本章主题),那么b1.beeHA[x]
是否仍然包含honeypot
引用变量
# 1 楼答案
ha
不是数组,而是变量。变量的值是对数组的引用,就像b1.beeHA
的值一样。所以说“arrayha
”被垃圾收集是没有意义的。当你写作时:它只是将
ha
的值复制到b1.beeHA
。它不是复制数组,只是复制引用您展示的代码创建了一个数组,其中包含对
Honey
的一个实例的四个引用。该数组有两个引用——一个在变量ha
中,另一个在变量b1.beeHA
中# 2 楼答案
如果没有更多的上下文,你的例子有点混乱;我看不到这些变量的作用域
如果一个对象持有对它的引用,那么它就不会被垃圾收集。蜜罐引用指向蜂蜜的新实例;ha阵列也是如此。b1实例指向ha阵列
如果绘制对象图,b1实例将指向ha,后者将指向蜜罐
如果b1是垃圾收集的,那么整个图是合格的
只要b1和ha存在,蜂蜜实例就不会被GC分解
# 3 楼答案
Java类型系统中的关键区别在于值语义和引用语义:当你说
x = y;
时,值被复制,引用被别名化基本类型(如
int
)具有值语义;类类型和数组具有引用语义。所以当你说b1.beeHA = ha;
时,你将引用别名为数组,也就是说现在ha
和b1.beeHA
都引用同一个数组当仍有对数组的引用时,垃圾收集器不会收集该数组