结果: 学生1:123,地址:杭州市 学生2:123,地址:杭州市 学生1:123,地址:西湖区 学生2:123,地址:西湖区 怎么两个学生的地址都改变了? 原因是浅复制只是复制了addr变量的引用,并没有真正的开辟另一块空间,将值复制后再将引用返回给新对象。 为了达到真正的复制对象,而不是纯粹引用复制。我们需要将Address类可复...
User user = newUser("大山", address);// 调用构造函数时进行深拷贝User copyUser = newUser(user.getName(), newAddress(address.getCity(),address.getCountry()));// 修改源对象的值user.getAddress().setCity("深圳");// 检查两个对象的值不同assertNotSame(user.getAddress().getCity(), copyUse...
实现深拷贝 要实现深拷贝,我们可以使用Java的序列化机制。序列化机制可以将对象转换为字节序列,然后再将字节序列恢复为对象。 以下是使用序列化机制实现深拷贝的示例代码: importjava.io.*;publicclassDeepCopyExample{publicstaticvoidmain(String[]args){MyObjectoriginal=newMyObject();MyObjectcopy=deepCopy(original)...
有以下几种方法可以拷贝一个对象: 使用构造函数进行拷贝: public class MyClass { private int value; public MyClass(MyClass original) { this.value = original.value; } // getters and setters } 复制代码 使用clone()方法进行拷贝: public class MyClass implements Cloneable { private int value; @...
String,Integer也是引用类型,是类。String可以直接赋值,而两个对象不相互影响是因为String是不可变类型。 即值不可改变,可以改变指向,直接赋值就是重开辟一个地址,将新值保存。所以直接复制后,两个对象相互不影响。 通过set方法,将A对象值赋给B对象 User.java ...
1>需要拷贝对象的类,去实现[Cloneable]接口 2>重写clone方法 3>使用"**对象.clone()**"的方式进行拷贝 示例 publicclassUserimplements Cloneable{privateStringname;privateIntegerage;privateStringsex;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicIntegergetAge(){return...
使用构造函数:可以通过调用对象的构造函数,传入原对象的属性值,创建一个新的对象。这种方式可以实现深拷贝,但需要手动复制每一个属性。 以下是使用构造函数复制对象的示例代码: classMyClass{privateintnum;privateString str;publicMyClass(intnum, String str){this.num = num;this.str = str; }publicMyClass(My...
这里先讲一下浅拷贝,浅拷贝会创建一个新对象,新对象和原对象本身没有任何关系,新对象和原对象不等,但是新对象的属性和老对象相同。具体可以看如下区别: 如果属性是基本类型(int,double,long,boolean等),拷贝的就是基本类型的值; 如果属性是引用类型,拷贝的就是内存地址(即复制引用但不复制引用的对象) ,因此如果...
按照前面官方文档提到的,clone通常是一个浅拷贝,如果要做到深拷贝,需要对复制对象中的对象引用进行修改,换句话说就是浅拷贝的效果就是引用例行的属性无法完全复制,被克隆对象和克隆对象中的该引用类型的属性指向同一个引用,并不是完全独立无关的。 举例:
1、引用拷贝 引用拷贝也就是我们常用的对象赋值,这种方式不会生成新的对象,只会在原对象上增加了一个新的对象引用,两个引用指向的对象还是是同一个; java 对象默认的赋值方式都是引用拷贝,比如说下面代码对象赋值的过程就是引用拷贝: User user1 = new User(); ...