-4

我目前正在学习我的 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中点运算符的所有应用程序,这也会有所帮助,谢谢。

4

2 回答 2

0

您正在使用与类本身相同类型的实例变量(参见第 1 行Island i)。这意味着,该类Island拥有i相同类型的属性Island。因此,每个岛屿都与另一个岛屿相连。您的分配定义了toi2.i = i3;的实例变量。换句话说:有一个链接到. 有的话就可以获得。i2i3i2i3i3i2

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

于 2017-02-02T22:22:35.007 回答
0

请务必注意此处的细节。

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

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

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

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

点不必以变量开头,任何表达式都可以。例如,您可以说(new Island()).i = x;创建一个新对象(它同样没有名称;对象永远没有名称)并将i该对象的成员绑定到绑定到x. 由于此对象从未绑定到任何变量,因此它立即符合收集条件。

您的代码示例的要点是,所有对象都绑定到超出范围的变量i1i2并且i3(即三个对象的成员变量),因此它们形成了一个引用循环。关于垃圾回收主题的一个有趣问题是这三个对象是否符合回收条件。

于 2017-02-02T22:22:55.987 回答