有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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引用变量


共 (3) 个答案

  1. # 1 楼答案

    ha不是数组,而是变量。变量的值是对数组的引用,就像b1.beeHA的值一样。所以说“arrayha”被垃圾收集是没有意义的。当你写作时:

    b1.beeHA = ha;
    

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

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

  2. # 2 楼答案

    如果没有更多的上下文,你的例子有点混乱;我看不到这些变量的作用域

    如果一个对象持有对它的引用,那么它就不会被垃圾收集。蜜罐引用指向蜂蜜的新实例;ha阵列也是如此。b1实例指向ha阵列

    如果绘制对象图,b1实例将指向ha,后者将指向蜜罐

    如果b1是垃圾收集的,那么整个图是合格的

    只要b1和ha存在,蜂蜜实例就不会被GC分解

  3. # 3 楼答案

    Java类型系统中的关键区别在于值语义引用语义:当你说x = y;时,值被复制引用被别名化

    基本类型(如int)具有值语义;类类型和数组具有引用语义。所以当你说b1.beeHA = ha;时,你将引用别名为数组,也就是说现在hab1.beeHA都引用同一个数组

    当仍有对数组的引用时,垃圾收集器不会收集该数组