Java| Java对象克隆Clone(2)

来源:互联网 发布:淘宝按重量标价 编辑:程序博客网 时间:2024/06/06 12:27

上篇文章简单的介绍了Java中对象克隆的浅层次克隆,这篇文章介绍深层次的克隆.

深层次克隆

被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不是原有的那些被引用的对象。换言之,深层复制要复制的对象引用的对象都复制一遍。

1.深层次克隆实现的简单机制:

在需要进一步Clone的成员属性上进行一次克隆后,将值给浅层次的克隆.有点难理解,看代码:
重点在clone方法中将引用类型的成员shop继续一次克隆,这里需要注意的是Shop 类这里是需要实现Cloneable接口的,原理在第一篇文章已经讲了,同样如果shop中还有引用成员则在Shop 中的方法依旧需要实现Clone方法,然后将Shop类的引用成员gen继续克隆.

package cn.com.yves.object.clone.newclone.clone;/** *  *  * @author Yves He *  */public class Cart implements Cloneable {    private String id;    private String creater;    private Shop shop;    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getCreater() {        return creater;    }    public void setCreater(String creater) {        this.creater = creater;    }    public Shop getShop() {        return shop;    }    public void setShop(Shop shop) {        this.shop = shop;    }    @Override    public Cart clone() throws CloneNotSupportedException {        Cart cart = null;        cart = (Cart) super.clone();        Shop shopClone = this.shop.clone();        this.setShop(shopClone);// 将本类中的引用成员继续clone后赋值给本类的clone对象        return cart;    }}
package cn.com.yves.object.clone.newclone.clone;/** *  *  * @author Yves He *  */public class Shop implements Cloneable {    private String name;    private double price;    private Generic gen; // 一般的参数    @Override    public Shop clone() throws CloneNotSupportedException {        return (Shop) super.clone();    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    }    public Generic getGen() {        return gen;    }    public void setGen(Generic gen) {        this.gen = gen;    }}
package cn.com.yves.object.clone.newclone.clone;/** *  *  * @author Yves He *  */public class Generic {    private String color;    private double size;    public String getColor() {        return color;    }    public void setColor(String color) {        this.color = color;    }    public double getSize() {        return size;    }    public void setSize(double size) {        this.size = size;    }}

测试方法:

    public static void main(String[] args) {        Generic gen = new Generic();        gen.setColor("red");        gen.setSize(100);        Shop shop = new Shop();        shop.setName("baoma");        shop.setPrice(100000);        shop.setGen(gen);        Cart cart = new Cart();        cart.setCreater("Yves");        cart.setId(UUID.randomUUID().toString());        cart.setShop(shop);        try {            Cart cartClone = cart.clone();            System.out.println(cartClone == cart);// false            System.out.println(cartClone.getShop() == cart.getShop());// false            System.out.println(cartClone.getShop().getGen() == cart.getShop().getGen());// true:                                                                                        // 因为在Shop类中的成员Generic对象我没有实现克隆,系统默认是用的原来的引用.        } catch (CloneNotSupportedException e) {            e.printStackTrace();        }    }

2.深层次克隆之串行化克隆

利用串行化来实现深层复制(也就是序列化和反序列化的方式)