【问题标题】:Array of object references对象引用数组
【发布时间】:2013-02-26 05:38:54
【问题描述】:

在 Java 中,让自定义对象 o 的类型为 CustomObject。然后CustomObject o2 = o; 将在不将o 的内容复制到o2 的情况下进行引用。但是对于CustomObjects 的数组,这种行为是否仍然存在:

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

os[1]os[2] 是引用还是 o 的直接副本,因此是单独的对象?

【问题讨论】:

  • 何不亲自检查一下?

标签: java object reference


【解决方案1】:

好吧,您实际上是指 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;

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

【讨论】:

  • 我问的原因是我有一个大的Graph 对象,其中节点的类型也是Graph。当我遍历图表时,我需要将一些节点放入数组Graph[],我想知道这是否很昂贵,这就是为什么担心将对象隐藏复制到数组位置的原因。那么这是否意味着我的数组的创建速度将与 C++ 中类似的指针数组一样快?
  • @SophieSperner:是的,非常相似。
猜你喜欢
  • 2016-06-27
  • 1970-01-01
  • 2019-10-03
  • 2013-03-04
  • 2011-06-05
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多