Java 数组赋值运算问题
如果我有这样一段代码:Java 数组赋值运算问题,java,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]引用的空间 问题 我说得对吗 浅拷贝还是深拷贝 如果是浅拷贝,我如何使深
MyClass[] objArray = new MyClass[7];
//assign values to objArray
//do something here
//sometime later
MyClass newObj = new MyClass();
objArray[3] = newObj;
上面的最后一句话将执行以下操作:
- 将
的所有内容复制到objArray[3]引用的空间李>newObj
objArray[3] = newObj;
不,它将在objArray[3]中存储对[引用对象:Thank Jon Skeet]newObj的引用。原始对象不会以任何方式被更改或复制,只是对它的引用。完全没有复制。对象的引用在数组中设置。完全没有副本。在数组中设置对对象的引用
MyClass
中重写java.lang.Object的克隆方法,并使用该方法或创建复制构造函数MyClass
中重写java.lang.Object的克隆方法,并使用该方法或创建复制构造函数newObj
变量的内容(或值)只是对对象的引用。换言之,考虑:
objArray[3] = newObj;
newObj.setFoo("hello");
System.out.println(objArray[3].getFoo()); // prints "hello"
(当然,假设一个简单的属性)
基本上,变量(包括数组元素)的值永远不是对象。它始终是一个引用或基本值。它总是按值传递或复制。好吧,它会将“newObj的所有内容”复制到objArray[3]
但是newObj
变量的内容(或值)只是对对象的引用。换言之,考虑:
objArray[3] = newObj;
newObj.setFoo("hello");
System.out.println(objArray[3].getFoo()); // prints "hello"
(当然,假设一个简单的属性)
基本上,变量(包括数组元素)的值永远不是对象。它始终是一个引用或基本值。它总是按值传递或复制。回答1和2:否。仅复制对对象的引用
newObj
和objArray[3]
随后将引用同一对象实例
回答3:如果你想要一个副本,你必须自己实现它。您可以实现一个复制构造函数或Clonable
,或者对于一个简单的深度复制,序列化和反序列化对象,但这要求它及其组成的所有对象都是可序列化的
回答4:对于所有Java对象来说都是一样的:代码驻留在堆上,代码只在引用对象时工作。容器类型通常实现执行浅层复制的复制构造函数。没有可自动用于所有类的深度复制功能。答案1和2:否。仅复制对对象的引用
newObj
和objArray[3]
随后将引用同一对象实例
回答3:如果你想要一个副本,你必须自己实现它。您可以实现一个复制构造函数或Clonable
,或者对于一个简单的深度复制,序列化和反序列化对象,但这要求它及其组成的所有对象都是可序列化的
回答4:对于所有Java对象来说都是一样的:代码驻留在堆上,代码只在引用对象时工作。容器类型通常实现执行浅层复制的复制构造函数。没有可自动用于所有类的深度复制功能。请注意,
newObj
不是一个对象,而是一个变量。区分两者很重要,因为给newObj
一个新值根本不会改变数组中的内容。请注意newObj
不是一个对象,而是一个变量。区分这两者很重要,因为给newObj
一个新值根本不会改变数组中的内容。没有对象的副本,只有引用。没有对象的副本,只有引用。这是一个很好的示例,可以说明数组如何引用对象!演示数组如何引用对象的好例子!