Java复制-浅拷贝与深拷贝

博客介绍Java中对象引用复制的三种方式。直接赋值复制的是引用,指向同一对象。浅拷贝对基本类型成员变量值传递,引用类型成员变量引用传递。深拷贝对引用和基本类型成员变量都值传递。还分别阐述了浅拷贝和深拷贝的实现方式。

将一个对象的引用复制给另外一个对象,一共有三种方式。第一种方式是直接赋值,第二种方式是浅拷贝,第三种是深拷贝。

1、直接赋值复制

在java中,A a1 =a2,我们需要理解的是这实际上复制的是引用,也就是说a1和a2指向的是同一个对象,因此当a1变化时候,a2里面的成员变量也会跟着变化。

2、浅拷贝

拷贝对象和原始对象的引用类型引用同一个对象。

1.对于数据类型是基本类型的成员变量,浅拷贝会进行值传递,也就是将该属性值复制一份给新的对象,因为是两份不同的数据,所以对其中一个对象的该成员变量进行修改,不会影响另一个对象拷贝得到的数据。
2.对于数据类型是引用类型的成员变量,比如说某个类的对象,数组等,那么浅拷贝会进行引用传递,也就是只将该成员变量的引用(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量指向同一实例,在这种情况下,在一个对象中修改该成员变量会影响到另一个对象得该成员变量值

浅拷贝的实现方式
1.通过拷贝构造方法实现浅拷贝:拷贝构造方法指的是该类的构造方法参数为该类的对象,使用拷贝构造方法可以很好的完成浅拷贝,直接通过一个现有的对象创造出与该对象属性相同的新对象。
2.通过重写clone()方法进行浅拷贝:Object类是类结构的根类,其中有一个方法为protected Object clone() throws CloneNotSupportedException,这个方法就是进行的浅拷贝。有了这个浅拷贝模板,我们通过调用clone()方法实现对象的浅拷贝。但是需要注意:1.Object类虽然有这个方法,但是是protected,所以无法直接使用。2.使用clone方法的类必须实现Cloneable接口,否则会抛出一场CloneNotSupportedException。对于这两点我们解决的方法是在要使用clone方法的类中重写clone方法,通过super.clone()调用object的原clone方法

3、深拷贝

拷贝对象和原始对象的引用类型引用不同对象。
对于数据类型是引用类型和基本类型的成员变量,深拷贝会进行值传递,也就是只将该成员变量的值复制一份给新的对象,而引用类型也构造相同的值,然后将一个新类引用返回拷贝结果。也就是将该属性值复制一份给新的对象,因为是两份不同的数据,所以对其中一个对象的该成员变量进行修改,不会影响另一个对象拷贝得到的数据。

深拷贝的实现方式
1.**通过重写clone方法:**只需要为对象图的每一层的每一个对象都实现Cloneable接口并重写clone方法,最后在最顶层的类的重写clone方法中调用所有的clone方法即可实现深拷贝。简单来说就是每一层的每个对象都进行浅拷贝= 深拷贝
2.通过对象序列化实现深拷贝
虽然层次调用clone方法可以实现深拷贝,但是代码量太大,特别对于属性数量多,层次比较深的类很难完成,而将对象序列化为字节序列,再通过反序列化可完美深拷贝。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值