Java数据克隆

为何要使用克隆:
假设有一个对象Car, 他有一个属性name, 当我们需要造一个Car,我们可以使用
Car benchi = new Car(“奔驰”),需要两辆,我们使用Car benchi2 = benchi;
但是当改变对象benchi的name属性,benchi2也同样会改变,但这并不是我们所希望的,所以我们可以使用java的clone方法来实现。
Java上要实现数据的深度克隆一般要实现Cloneable接口。
如下例子:

1)例一:

package test;

public class Car implements Cloneable {

    private String name = "";

    public Car(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Object clone() {
        Car o = null; 
        try { 
            o = (Car) super.clone(); 
        } catch(CloneNotSupportedException e) { 
            e.printStackTrace(); 
        } 
        return o; 
    }

}

 

Car benchi1 = new Car(“奔驰”);

克隆一个Car, Car benchi2 = benchi1.clone();

改变benchi2的属性,benchi1的属性不会变。

2)例二:

public class Car implements Cloneable {

    private String name = "";
    private Wheel wheel = new Wheel();

    public Car(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Object clone() { 
        Car o = null; 
        try { 
            o = (Car) super.clone(); 
        } catch(CloneNotSupportedException e) { 
            e.printStackTrace(); 
        } 
        return o; 
    }

    public Wheel getWheel() {
        return wheel;
    }

    public void setWheel(Wheel wheel) {
        this.wheel = wheel;
    }

}

Car还有一个属性Wheel(轮子), 如果我们对Car实现深度克隆的话,那么Wheel也必须实现Cloneable接口。

public class Wheel implements Cloneable {

    private int diamater = 30;

    public Wheel() {}

    public Wheel(int diamater) {
        this.setDiamater(diamater);
    }

    public Object clone() { 
        Wheel o = null; 
        try { 
            o = (Wheel) super.clone(); 
        } catch(CloneNotSupportedException e) { 
            e.printStackTrace(); 
        } 
        return o; 
    }

    public int getDiamater() {
        return diamater;
    }

    public void setDiamater(int diamater) {
        this.diamater = diamater;
    }
}

Car benchi1 = new Car();

克隆一个Car, Car benchi2 = benchi1.clone();

benchi2.setWheel((Wheel)(benchi1.getWheel().clone()));

同样,如果再Car中有对象(如:Map,List等)时,内置对象也要实现Cloneable接口。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>