浅拷贝、深拷贝

作者: 大黑跟小白的日常 | 来源:发表于2019-01-29 16:03 被阅读64次

    浅拷贝、深拷贝

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

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

    浅拷贝

    浅克隆模型

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

    代码表示

    浅拷贝

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

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

    浅拷贝

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

    深拷贝

    深克隆模型

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

    代码如下表示

    原对象的引用属性操作改变属性对象值,对克隆对象无影响 重写clone方法,针对引用类型属性,同样实施克隆

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

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

    也可以这样实现深拷贝

    或者

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

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

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

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

    相关文章

      网友评论

        本文标题:浅拷贝、深拷贝

        本文链接:https://www.haomeiwen.com/subject/mbatsqtx.html