Java复制-浅拷贝与深拷贝

    xiaoxiao2025-07-18  6

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

    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方法可以实现深拷贝,但是代码量太大,特别对于属性数量多,层次比较深的类很难完成,而将对象序列化为字节序列,再通过反序列化可完美深拷贝。

    最新回复(0)