数组中的元素是对象的引用还是引用它?

时间:2011-04-24 15:11:19

标签: java arrays reference

如果我有一个AnObjects数组,我这样做:

AnObject oldObject = arrayOfObjects[validIndex];
arrayOfObjects[validIndex] = new AnObject(oldObject.getVariableForContruction);
oldObject.terminate();

arrayOfObjects[validIndex]的新内容是否会被终止,或原始oldObject被终止?

换句话说:oldObject是否包含对AnObject的引用,或者它是否包含对AnObject的引用的引用?

4 个答案:

答案 0 :(得分:3)

这段代码有点令人困惑。您的对象数组必须引用AnObject

AnObject oldObject = arrayOfObjects[validIndex];

您可以在此处将该引用分配给oldObject

arrayOfObjects[validIndex] = new AnObject(oldObject.getVariableForContruction);

现在,您将validIndex处的数组引用设置为指向AnObject的新实例。它不再指向oldObject

oldObject.terminate();

它是对堆上对象的引用。

oldObject指的是堆上的实例;数组中的引用指向您在堆上创建的新实例。

如果oldObject被终止(无论这意味着什么),那么对于您创建的新实例来说,这并不重要。该数组仍然指向新实例。

答案 1 :(得分:1)

它包含对象的引用。在这种情况下,oldObject将被终止 - 而不是您放置在数组中的新实例。

答案 2 :(得分:1)

  • 假设arrayOfObjects从 记忆位置100.
  • 假设 validIndex为0。

然后arrayOfObjects [validIndex]表示内存位置100。

  • 假设存储位置100具有 价值200。

    AnObject oldObject = arrayOfObjects [validIndex];

oldObject位于内存位置200。

arrayOfObjects[validIndex] = new AnObject(oldObject.getVariableForContruction);
  • 假设呼叫新分配 对象是内存位置300。

然后存储器位置100具有值300。

oldObject.terminate();

oldObject从未更改过,因此它仍指向内存位置200。

因此,在用新对象替换之后,以前在数组中的项将被终止。

答案 3 :(得分:0)

在Java中没有对引用的引用。忽略基元类型,然后所有变量/数组单元都保持对对象的引用。这是一个片段,说明了这一点:

class Something {
  public int n;
}    

Something[] arr = new Something[2];
Something s = new Something();
s.n = 2;

arr[0] = s;
System.out.print(arr[0].n); // Output: "2"
arr[0].n += 1;
System.out.print(s.n); // Output: "3"