2013-02-25 48 views
1

在Java中,让自定义对象o的类型为CustomObject。然后CustomObject o2 = o;会作参考,但不会将o的内容复制到o2。但是,将这种行为仍然为CustomObject秒的数组:对象引用数组

CustomObject[] os = new CustomObject[2]; 
os[1] = o; 
os[2] = o; 

os[1]os[2]是引用或者他们会因而单独对象o直接复制?

+1

为什么不检查,看看你的自我? – yurib 2013-02-25 21:26:55

回答

7

嗯,实际上你的意思是os[0]os[1],因为数组在Java中是基于0的......但是,它们将是引用。这两个数组元素都会引用同一个对象。

重要的是,o不是一个对象之一:

  • o可变:它有一个名称和一个值
  • o的值是一个参考:它或者空,或者它指的是一个对象
  • 一个对象有字段,是一定的执行时间类型等

表达式的值(无论它是一个简单的变量值,方法调用或任何的结果)是从未 Java中的object - 它总是任一个的提及或原始值。

方式Java语言规范defines arrays是一样的变量的集合:

数组对象包含多个变量。变量的数量可以是零,在这种情况下,数组被称为空。包含在数组中的变量没有名称;相反,它们由使用非负整数索引值的数组访问表达式引用。这些变量被称为数组的组件。如果一个数组有n个分量,我们说n是数组的长度;数组的组成部分使用0到n - 1之间的整数索引进行引用。

所以真的有点像做:

// Creating the pseudo-array 
CustomObject o0 = null; 
CustomObject o1 = null; 

// Populating it 
o0 = o; 
o1 = o; 

与以往一样,赋值运算符只是复制右侧向左侧的值。该值是一个参考。

+0

我问的原因是我有一个很大的'Graph'对象,其中节点的类型也是'Graph'。当我遍历图时,我需要将一些节点放入一个'Graph []'数组中,我想知道这是否昂贵,这就是为什么担心将对象隐藏到阵列位置的原因。那么这是否意味着我的数组的创建速度与C++中类似的指针数组一样快? – 2013-02-25 21:38:03

+0

@SophieSperner:是的,非常相似。 – 2013-02-25 21:40:12

+0

啊哈,所以Java并没有那么糟糕。接受的答案:) – 2013-02-25 21:41:54