Java的深度克隆和浅度克隆

来源:互联网 发布:股票数据接口 刷新 编辑:程序博客网 时间:2024/05/17 02:58
说到克隆,其实是个比较简单的概念,跟现实生活正的克隆一样,复制一个一模一样的对象出来。clone()这个方法是从Object继承下来的,一个对象要实现克隆,需要实现一个叫做Cloneable的接口,这个接口没有什么方法,和Comparable接口差不多,仅仅是起一个标志作用,实现了这个接口你就能实现克隆操作。

这里有两个概念,深度克隆和浅度克隆,这东西虽然平常不怎么用,但是了解一下还是有必要的。Object中的克隆方法是浅度克隆,JDK规定了克隆需要满足的一些条件,简要总结一下就是:对某个对象进行克隆,对象的的成员变量如果包括引用类型或者数组,那么克隆的时候其实是不会把这些对象也带着复制到克隆出来的对象里面的,只是复制一个引用,这个引用指向被克隆对象的成员对象,但是基本数据类型是会跟着被带到克隆对象里面去的。而深度可能就是把对象的所有属性都统统复制一份新的到目标对象里面去。简单画个图:



下面是测试代码

public class Product implements Cloneable {public Farmer farmer; // 引用对象类型@Overrideprotected Product clone() throws CloneNotSupportedException {Product product = (Product) super.clone();//if (null != farmer) product.farmer = farmer.clone(); 深度克隆,否则克隆出来的对象里面的farmer属性指向原始对象的farmer属性地址return product;}}public class CloneTest {public static void main(String[] args) throws Exception {Product product = new Product();product.farmer = new Farmer();Product product2 = (Product) product.clone();boolean eql = product.farmer == product2.farmer;// true 同一个对象}}



而如果要进行所谓的深度克隆,在重写clone方法的时候把属性也克隆一下,也就是上面代码的去掉注释。




1 0