我正在用Java执行以下语句,
Obj t[] = new Obj[10];
Obj a = new Obj("a");
t[0] = a;
a = new Obj("b");
t[1] = a;
为什么在Java中,当我访问t [0]时,返回的是“a”而不是“b”?
这是因为GC吗?我可以相信这样做是安全的吗
最佳答案
这就是正在发生的事情。
Obj t[] = new Obj[10]; // 1
Obj a = new Obj("a"); // 2
t[0] = a;
a = new Obj("b"); // 3
t[1] = a; // 4
Obj
实例的引用。将此称为obj01
。您将其分配给t
。请注意,变量t
和实际对象obj01
具有非常随意的关系。 Obj
的实例,将其称为obj02
。您将对该对象的引用分配给变量a
。请注意,变量a
和实际对象obj02
具有非常随意的关系。您还将此引用放入
t[0]
中。您在两个地方都知道一个对象。对象obj02
(值为"a"
)被称为a
,也被称为t[0]
。 Obj
的实例,将其称为obj03
。您可以将对此新对象的引用分配给旧变量a
。请注意,变量a
和实际对象obj03
具有非常随意的关系。 a
曾经引用obj02
,但现在不再引用它。因此,
obj01
引用了t
(一个数组); obj02
(和Obj
的实例)被称为t[0]
; obj03
(Obj
的实例)被称为a
。 a
中的引用放入t[1]
中。因此,t[1]
获得对obj03
的引用。 此时,所有对象均由范围内的变量引用。由于所有对象都有引用,因此无法对其进行垃圾回收。
关于java - 在Java中为Array中的元素分配引用时会发生什么情况?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/380632/