数组赋值操作问题

时间:2011-05-19 12:55:48

标签: java

如果我有一段这样的代码:

MyClass[] objArray = new MyClass[7];
//assign values to objArray
//do something here
//sometime later
MyClass newObj = new MyClass();
objArray[3] = newObj;

上面的最后一个声明将执行以下操作:

  • newObj的所有内容复制到objArray [3]引用的空间。

问题

  1. 我是对的吗?

  2. 浅拷贝还是深拷贝?

  3. 如果是浅拷贝,我怎样才能使深拷贝成为可能?

    objArray[3] = newObj; 
    
  4. 此规则是否适用于其他Java容器类型,例如Queue,List,...?

5 个答案:

答案 0 :(得分:5)

好吧,它将<{em>将“newObj”的所有内容复制到objArray[3] ... 内容(或值) newObj变量的只是对象的引用。换句话说,请考虑:

objArray[3] = newObj;
newObj.setFoo("hello");

System.out.println(objArray[3].getFoo()); // prints "hello"

(当然,假设一个简单的属性)。

基本上,变量(包括数组元素)的值是从不对象。它总是 引用或原始值。 总是按值传递或复制。

答案 1 :(得分:5)

答案1&amp; 2:否。仅复制对象的引用。 newObjobjArray[3]之后将引用相同的对象实例。

答案3:如果你想要一份副本,你必须自己实施。您可以实现复制构造函数或Clonable,或者对于简单的深层复制,序列化和反序列化对象,但这需要它,并且它包含的所有对象都是Serializable

答案4:所有Java对象都完全相同:驻留在堆上,代码仅适用于对象的引用。容器类型通常实现执行浅复制的复制构造函数。没有深度复制功能可自动用于所有类。

答案 2 :(得分:2)

  1. 不,它不会复制内容。它只是创建了另一个参考。
  2. 浅。 (见1)
  3. 如果您想要深层复制,则无法使用该语句。您必须覆盖类MyClass中的java.lang.Object的clone-method并使用它或创建复制构造函数。
  4. 它适用于非原始数据的所有数据类型,如int或double;

答案 3 :(得分:1)

  

将newObj的所有内容复制到   objArray [3]提到的空间。

不,它会在objArray [3]中存储[引用的对象:感谢Jon Skeet ] newObj的引用。原始对象不会以任何方式更改或复制,只是对它的引用。

答案 4 :(得分:1)

完全没有副本。对象的引用在数组中设置。