0

假设我有一个包含如下字符串的对象:

class SomeObject  {
   private final String s;
   private final int i;

   SomeObject(String s, int i) {
      this.s = s;
      this.i = i;
   }

   String getString() {
      return s;
   }
}

因此,如果我只使用没有 的引用SomeObject,例如我用来构建另一个对象并且我不需要i任何其他可能的字段,它会被垃圾收集吗?

编辑:我很抱歉不清楚。假设我有一个名为 someObject 的 SomeObject 实例,如果我让 s 引用使用 getString() 方法转义,即 someObject.getString() 并使用返回的引用来构建其他对象,例如不是 SomeObject 实例, someObject 是否可以被垃圾收集?

4

3 回答 3

2

我想你指的是s?是的,实例SomeObject将免费用于垃圾收集。TheString没有引用SomeObject它的来源。

于 2012-09-01T20:16:27.787 回答
2

getString()会返回s,但不会从当前的SomeObject. 如果一个值x被分配给s

s = x;

xy如果您分配一个新值,只会被垃圾收集s

s = y;

并且没有提到xleft。

于 2012-09-01T20:26:55.437 回答
2

让我问你一下。

final class Foo {
  String value = "initial";
}

假设您执行如下代码...

final Foo foo = new Foo();
final String val = foo.value;
foo.value = "replaced";

现在,你认为val现在会相等"replaced"吗?希望不会,因为它不会;看来您对参考是什么有一些误解。使用val = foo.value,您将字段的值复制foo.valueval; 该值是对字符串的引用"initial"。它不是对该字段的引用foo.value。坚持对 to 的引用"initial"并不能防止foo被垃圾收集。

于 2012-09-01T20:36:28.040 回答