Java对象引用和垃圾回收

时间:2017-02-02 22:16:28

标签: java pointers dot-operator

我目前正在攻读我的Java副学士证书,我有正式的学习课本。在教科书中是以下示例代码。

public class Island {
    Island i;

    public static void main(String[] args) {

        Island i2 = new Island();
        Island i3 = new Island();
        Island i4 = new Island();

        i2.i = i3;
        i3.i = i4;
        i4.i = i2;

我在这里理解我已经使用引用变量i2,i3和i4初始化了3个Island对象,每个对象指向它们自己的对象。 i2然后被重定向到指向i3和i3指向i4等。我不明白的是需要" i2.i"点运营商,这到底在做什么?是i2 = i3不是同样有效吗?

如果有人有任何好的资源,我可以深入阅读java中点运算符的所有应用程序,这也很有用,谢谢。

2 个答案:

答案 0 :(得分:0)

您正在使用与类本身相同类型的实例变量(请参阅第Island i行)。这意味着,类Island包含相同类型i的属性Island。因此,每个岛屿都与另一个岛屿相连。您对i2.i = i3;的分配将i2的实例变量定义为i3。换句话说:i2有一个指向i3的链接。如果您有i3,则可以获得i2

如果您使用了作业i2 = i3i2的引用将覆盖i3的值。这意味着i2不再使用,i3后面的对象也将是i2后面的同一个对象(相同的对象,2个不同的变量名)。

答案 1 :(得分:0)

请务必注意这里的细节。

您确实创建了三个对象,但这些对象与变量不同。

让我们简单一点:考虑Island x = new Island();Island y;您有两个变量xy,但只有一个对象。该对象没有名称,但它绑定到变量x,因此当您说x时,您将获得该对象。当你说y时,你什么也得不到(y为空)。

点访问由其前面的表达式表示的对象。因此x.i访问绑定到i的对象的x成员变量,同样地,y.i试图访问根本没有对象的成员变量,这会导致抛出异常。

现在很明显,您可以说x.i = x;将绑定到Island.i的对象的成员变量x设置为恰好是同一个对象的值。或者您可以将其设置为其他内容,例如x.i = new Island();x.i = y;

点不必以变量开头,任何表达式都可以。例如,您可以说(new Island()).i = x;创建一个新对象(它也没有名称;对象永远不会有名称)并将该对象的i成员绑定到绑定到{{ 1}}。由于此对象永远不会绑定到任何变量,因此它立即有资格进行收集。

代码示例的要点是所有对象都绑定到超出xi1i2范围的变量(即三个成员变量)对象),因此它们形成参考周期。关于垃圾收集主题的一个有趣问题是这三个对象是否有资格收集。