【问题标题】:Java Object reference and garbage collectionJava 对象引用和垃圾回收
【发布时间】:2017-06-20 04:20:01
【问题描述】:

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

【问题讨论】:

  • “任何好的资源”任何 Java 指南怎么样?请参阅 objects 上的章节/部分/页面,例如The Java™ Tutorials - Objects.
  • 不是我要找的。​​span>

标签: java pointers dot-operator


【解决方案1】:

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

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

【讨论】:

  • 是的,我现在明白了。非常感谢。
  • 如果您愿意,可以投票或接受答案:)
  • 显然我的代表太低了,不能这样做
【解决方案2】:

注意这里的细节很重要。

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

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

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

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

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

您的代码示例的要点是,所有对象都绑定到存在于i1i2i3 范围之外的变量(即三个对象的成员变量),因此它们形成一个参考循环。关于垃圾回收主题的一个有趣问题是这三个对象是否符合回收条件。

【讨论】:

  • 谢谢,很有道理。
猜你喜欢
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多