我正在用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
  • 您创建了一个数组,该数组可以包含10个对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/

    10-12 00:13
    查看更多