JAVA深拷贝与浅拷贝

1.概念
java中的拷贝需要实现java.lang.Cloneable接口,然后重写clone()方法,这个无论深、浅拷贝都需要这样做。
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
2.代码
先是浅拷贝,定义父亲和孩子类,其中父亲中有孩子的引用对象,且父亲实现了克隆。
在这里插入图片描述

再创建一个父亲对象,赋值,然后克隆一个父亲对象,最后修改克隆的对象属性值,输出。
在这里插入图片描述

可以看到,奇怪的现象出来了,对克隆对象wpn中引用对象child的属性值修改,同步到了被克隆的对象wp中,这也就是浅拷贝了。
在这里插入图片描述

那如何实现深拷贝呢?也很简单,将属性中的引用对象也实现克隆就行了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,拷贝(Deep Copy)和拷贝(Shallow Copy)是用于描述对象拷贝的概念。 拷贝是指创建一个新对象,新对象的属性值和原对象的属性值相同,但是对于引用类型的属性,新旧对象将共享同一个引用。也就是说,新旧对象的引用类型属性指向同一个内存地址。 拷贝则是在拷贝对象时,不仅会复制对象本身,还会递归复制对象的引用类型属性,使得新对象和原对象的引用类型属性指向不同的内存地址。 Java 中的默认拷贝行为是拷贝。可以通过以下两种方式实现拷贝: 1. 实现 `Cloneable` 接口并重写 `clone()` 方法:这是一种较为简单的实现拷贝的方式。在需要进行拷贝的类中,实现 `Cloneable` 接口,并重写 `clone()` 方法,在 `clone()` 方法中递归复制引用类型的属性。 ```java class MyClass implements Cloneable { private int number; private MyObject myObject; // constructors, getters, setters @Override protected Object clone() throws CloneNotSupportedException { MyClass cloned = (MyClass) super.clone(); cloned.myObject = (MyObject) myObject.clone(); // 实现 MyObject 的 clone() 方法 return cloned; } } ``` 通过调用 `clone()` 方法来创建一个新的拷贝对象:`MyClass clonedObject = (MyClass) originalObject.clone();` 2. 使用序列化和反序列化:这是另一种实现拷贝的方式。通过将对象序列化为字节流,然后再将字节流反序列化为新的对象,可以实现拷贝。这种方式需要确保对象及其引用类型属性都是可序列化的。 ```java import java.io.*; class MyClass implements Serializable { // class definition } ``` ```java // 实现拷贝的方法 public static <T extends Serializable> T deepCopy(T object) throws IOException, ClassNotFoundException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream); objectOutputStream.writeObject(object); ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); ObjectInputStream objectInputStream = new ObjectInputStream(inputStream); return (T) objectInputStream.readObject(); } ``` 通过调用 `deepCopy()` 方法来创建一个新的拷贝对象:`MyClass clonedObject = deepCopy(originalObject);` 需要注意的是,为了实现拷贝,引用类型的类也需要实现 `Cloneable` 接口并重写 `clone()` 方法,或者是可序列化的。 希望这些信息对你有所帮助。如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值