English 中文(简体)
当你在Java中将一个引用分配给一个数组中的元素时,会发生什么事情?
原标题:
  • 时间:2008-12-19 10:48:08
  •  标签:

我正在使用Java编写以下语句。

Obj t[] = new Obj[10];

Obj a = new Obj("a");
t[0] = a;

a = new Obj("b");
t[1] = a;

Why in java, when i access t[0] , it returns me "a", rather than "b"? Is this because of the GC? and can i believe it is safe to do such an operation

最佳回答

这里有确切的发生情况。

Obj t[] = new Obj[10];  // 1

Obj a = new Obj("a");   // 2
t[0] = a;

a = new Obj("b");       // 3
t[1] = a;               // 4
  1. 你创建了一个可以容纳10个指向Obj实例的引用的数组。将其称为obj01。你将其赋值给t。请注意,变量t和实际对象obj01之间有一个相当随意的关系。

  2. 你创建了Obj的一个实例,将其命名为obj02。你将这个对象的引用分配给变量a。请注意,变量a和实际对象obj02之间存在相当随意的关系。

    你也把这个引用放进了 t[0]。你有一个对象在两个地方都得到了确认。对象obj02(值为"a")被确认为a,也被确认为t[0]

  3. 您创建了一个名为Obj的实例,将其命名为obj03。您将对此新对象的引用分配给旧变量a。请注意,变量a和实际对象obj03之间存在一种相当随意的关系。 a曾经引用obj02,但现在它不再引用它。

    因此,obj01(一个数组)由t引用;obj02Obj的实例)被称为t[0]obj03Obj的实例)被称为a

  4. 你将在a中的参考放入t[1]中。因此,t[1]获得对obj03的引用。

此时所有的对象都被在作用域内的变量所引用。因为所有的对象都有引用,所以它们不能被垃圾回收。

问题回答

问题在于,Java没有指针。

当您将一个对象变量分配给另一个对象变量时,它会改变该变量指向的内容,但不会影响您可能拥有的其他引用。

那么:

Object a = new Object("a");
Object b = new Object("b");

a = b;
b = new Object("c");

// At this point, a = "b"
// and b = "c"

正如您所看到的,尽管您最初将 a = b,但当您将 b 设置为新对象时,a 仍保留对旧对象的引用。

数组中的值只是一个引用。 这就像做这样的事情:

Obj a = new Obj("a"); 
Obj t0 = a;
a = new Obj("b");

最后,变量t0具有在第2行给定的值-即第1行创建的第一个Obj的引用。更改a变量的值不会改变t0的值。

一旦你理解了以上内容,就把数组想象成一组变量即可。

Obj[] t = new Obj[10];

大致上就像宣布:

Obj t0, t1, t2, t3, t4, t5, t6, t7, t8, t9;

这里有很多差异,但在这个问题的语境下它们是相似的。

当你执行t [0] = a时,你将通过new Object("a")创建的对象的地址分配给数组,在你重新使用变量a时,不会更改数组中包含的值。 当你执行t [0] = a时,你将通过new Object("a")创建的对象的地址分配给数组,在你重新使用变量a时,不会更改数组中包含的值。

为什么在Java中,当我访问t [0]时,它会返回“a”,而不是“b”?

因为你告诉他用"a"持有对象的引用。

Java不直接操纵对象。相反,它使用对象引用。但是,该引用保存引用的值(而不是引用)。因此,当您将a的值分配给t [0]时,它们都引用相同的对象。 (不te: The character "has" in the original text is probably a typo and should be "uses". This answer assumes that.)

让我们看看这张图片是否能更好地解释:

请将此翻译成中文:alt text http://img520.imageshack.us/img520/8857/referencesq4.png

首先,a和t[0]引用相同的对象。

稍后引用会去掉,但t [0]不会。

最后,a和t[1]引用相同的对象,而t[0]保持不变。

这是因为垃圾回收器吗?

我能相信这样的操作是安全的吗?

是的 (Shì de)





相关问题