浅拷贝、深拷贝

浅拷贝、深拷贝


浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。

 深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。

浅拷贝

15253776-02bcf66f77ae8ed3.png
浅克隆模型

浅拷贝的对象跟原对象会存在公共的引用指向对象。

代码表示

15253776-f888c76865365322.png
浅拷贝

如上,成员属性如果是引用类型的话,那么拷贝的对象的引用跟原对象的引用是指向的同一个对象。

当原对象的成员属性的引用没有指向新的成员对象,而使用成员引用操作成员对象的值时,会同步对浅拷贝的对象中的属性对象造成影响。

15253776-5cf0641432497659.png
浅拷贝

如上,对于基本类型、String,是属于值传递,不存在所谓的共享。对于引用类型的成员属性,是属于同一个对象。

深拷贝

15253776-57610c0b00303981.png
深克隆模型

克隆对象跟原对象无任何交集,包括成员属性对象,也都是不同的对象。只是,将值的一份拷贝。

代码如下表示

15253776-fcf4671596a3049c.png
原对象的引用属性操作改变属性对象值, 对克隆对象无影响
15253776-6295e9e672c1710a.png
重写clone方法,针对引用类型属性,同样实施克隆
15253776-0e28e882815485e2.png

这样就要求所有的属性,层层引用类型,都必须实现Cloneable接口,并且重写clone方法,在方法中,如果存在引用类型,调用引用类型的clone()再赋值。

默认的super.clone属于浅拷贝。

也可以这样实现深拷贝

15253776-0955b1f39c7f20aa.png

或者

15253776-3a80470306cbfffb.png


还可以通过对象的序列化,跟反序列化实现一个对象的深克隆。要求对象类、属性类都必须implements Serializable接口。

而利用clone方法,则要求的是对象类、对象的层层属性类,都必须实现Cloneable接口,并在重写的clone方法中,针对引用类型需再次调用其clone()再赋值。


如下说明super.clone()出来的对象跟原对象不是同一个对象在内存空间中是不同的两份。层级只是对象的第一层的复制。

15253776-ae57047c01619904.png

如此,深拷贝、浅拷贝基本讲解清楚了。

猜你喜欢

转载自blog.csdn.net/weixin_34228387/article/details/87411092