如果我有一段这样的代码:
MyClass[] objArray = new MyClass[7];
//assign values to objArray
//do something here
//sometime later
MyClass newObj = new MyClass();
objArray[3] = newObj;
上面的最后一个声明将执行以下操作:
newObj
的所有内容复制到objArray [3]引用的空间。 我是对的吗?
浅拷贝还是深拷贝?
如果是浅拷贝,我怎样才能使深拷贝成为可能?
objArray[3] = newObj;
此规则是否适用于其他Java容器类型,例如Queue,List,...?
答案 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:否。仅复制对象的引用。 newObj
和objArray[3]
之后将引用相同的对象实例。
答案3:如果你想要一份副本,你必须自己实施。您可以实现复制构造函数或Clonable
,或者对于简单的深层复制,序列化和反序列化对象,但这需要它,并且它包含的所有对象都是Serializable
答案4:所有Java对象都完全相同:驻留在堆上,代码仅适用于对象的引用。容器类型通常实现执行浅复制的复制构造函数。没有深度复制功能可自动用于所有类。
答案 2 :(得分:2)
MyClass
中的java.lang.Object的clone-method并使用它或创建复制构造函数。答案 3 :(得分:1)
将newObj的所有内容复制到 objArray [3]提到的空间。
不,它会在objArray [3]中存储[引用的对象:感谢Jon Skeet ] newObj的引用。原始对象不会以任何方式更改或复制,只是对它的引用。
答案 4 :(得分:1)
完全没有副本。对象的引用在数组中设置。