浅拷贝、深拷贝
浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。
深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。
浅拷贝
浅克隆模型浅拷贝的对象跟原对象会存在公共的引用指向对象。
代码表示
浅拷贝如上,成员属性如果是引用类型的话,那么拷贝的对象的引用跟原对象的引用是指向的同一个对象。
当原对象的成员属性的引用没有指向新的成员对象,而使用成员引用操作成员对象的值时,会同步对浅拷贝的对象中的属性对象造成影响。
浅拷贝如上,对于基本类型、String,是属于值传递,不存在所谓的共享。对于引用类型的成员属性,是属于同一个对象。
深拷贝
深克隆模型克隆对象跟原对象无任何交集,包括成员属性对象,也都是不同的对象。只是,将值的一份拷贝。
代码如下表示
原对象的引用属性操作改变属性对象值,对克隆对象无影响 重写clone方法,针对引用类型属性,同样实施克隆这样就要求所有的属性,层层引用类型,都必须实现Cloneable接口,并且重写clone方法,在方法中,如果存在引用类型,调用引用类型的clone()再赋值。
默认的super.clone属于浅拷贝。
也可以这样实现深拷贝
或者
还可以通过对象的序列化,跟反序列化,实现一个对象的深克隆。要求对象类、属性类都必须implements Serializable接口。
而利用clone方法,则要求的是对象类、对象的层层属性类,都必须实现Cloneable接口,并在重写的clone方法中,针对引用类型需再次调用其clone()再赋值。
如下说明super.clone()出来的对象跟原对象不是同一个对象,在内存空间中是不同的两份。层级只是对象的第一层的复制。
如此,深拷贝、浅拷贝基本讲解清楚了。
网友评论