我的课文要求我计算对一个对象的引用。在给定的代码中包含以下内容:
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引用变量吗?
发布于 2012-01-31 07:36:36
ha不是一个数组,它是一个变量。变量的值是对数组的引用-与b1.beeHA的值一样。因此,谈论“数组ha”被垃圾回收是没有实际意义的。当你写的时候:
b1.beeHA = ha;这只是将ha的值复制到b1.beeHA中。它不是在复制数组-它只是在复制引用。
您所显示的代码创建了一个数组,其中包含对一个Honey实例的四个引用。有两个对该数组的引用-一个在变量ha中,另一个在变量b1.beeHA中。
发布于 2012-01-31 07:36:24
Java类型系统中的关键区别是值语义和引用语义:当您说x = y;时,值将被复制,而引用将被别名。
原始类型(如int)具有值语义;类类型和数组具有引用语义。因此,当您说b1.beeHA = ha;时,您为数组的引用设置了别名,也就是说,现在ha和b1.beeHA都引用了同一个数组。
垃圾收集器不会在仍有对数组的引用时收集该数组。
发布于 2012-01-31 07:36:52
在没有更多上下文的情况下,您的示例有点令人困惑;我看不到这些变量的范围。
如果有一个对象持有对一个对象的引用,那么该对象将不会被垃圾回收。蜜罐引用指向Honey的新实例;ha数组也是如此。b1实例指向ha数组。
如果绘制一个对象图,b1实例将指向ha,而ha又指向蜜罐。
如果b1是垃圾收集的,那么整个图都是合格的。
只要b1和ha还存在,Honey实例就不会被GC。
https://stackoverflow.com/questions/9072361
复制相似问题