2011-04-24 105 views
1

如果我有AnObjects的数组,我这样做:数组中的元素是对象的引用还是它自身的引用?

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

是否的arrayOfObjects[validIndex]新的内容就会被终止,或者做原来oldObject遭到终止?

换句话说:oldObject包含对AnObject的引用还是包含对AnObject引用的引用?

回答

3

这段代码有点混乱。您的对象数组必须具有对AnObject的引用。

AnObject oldObject = arrayOfObjects[validIndex]; 

您在此处将该参考号分配给oldObject

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

现在你设定在validIndex数组引用指向的AnObject一个新的实例。它不再指向oldObject

oldObject.terminate(); 

这是对堆上对象的引用。

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

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

+0

对不起,命名终止是在我的项目上下文中,它可以基本上是任何方法调用,但是在新实例上调用方法调用?我明白了吗? – Samuel 2011-04-24 15:22:04

+0

不,如果terminate不是静态的,它会在实例上调用 - 在你的例子中是oldObject。不是您创建数组引用指向的新实例。 – duffymo 2011-04-24 15:29:39

1

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

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" 
1
  • 假设arrayOfObjects在 存储器位置开始100
  • 假设 validIndex是0

然后arrayOfObjects [validIndex]表示存储器位置100.

  • Assu我知道内存位置100有一个 的值为200.

    AnObject oldObject = arrayOfObjects [validIndex];

的OLDobject是在存储位置200

arrayOfObjects[validIndex] = new AnObject(oldObject.getVariableForContruction); 
  • 假设调用new分配 对象的存储位置300。

然后存储位置100从来没有改变过300

oldObject.terminate(); 

的OLDobject的值,所以它在内存位置仍指向200

所以,这曾经是项目在数组被替换为新对象后终止。

+0

非常感谢。非常清楚 – Samuel 2011-04-24 15:36:04

相关问题