深层复制和浅层复制

        写作的目的在于表达自己的看法,与各位共同交流,希望发现自己写作中的不足,不断完善自我,当然,我的看法不一定是对的,希望各位用于怀疑,指出其中的不足,希望一同努力。

         要理解深层复制和浅层复制,首先需要理解复制是什么?复制即在内存中给对象创建一个本地副本,当对本地副本的内容进行修改时,并不会修改原对象内容。对于深层复制,其生成的本地副本,修改任意对象的属性,都不会对原对象产生更改,但是对于浅层复制,修改对象的某些属性,可能会使原对象发生修改,其中某些属性一般指该对象内部包含的引用。

         下面举例说明。有疑惑的地方,还请各位指出

浅层复制

// 人的外貌
public class Looks implements Cloneable{
    private String look;
    public String getLook() {
        return look;
    }
    public void setLook(String look) {
        this.look = look;
    }
    Looks(String look){
        this.look = look;
    }
    @Override
    public String toString(){
        return "look"+":"+look;
    }
}
public class Person implements Cloneable{
    // 外貌
    private Looks looks;
    // 体重
    private Integer weight;
    public Integer getWeight() {
        return weight;
    }
    public void setWeight(Integer weight) {
        this.weight = weight;
    }
    public Looks getLooks() {
        return looks;
    }
    public void setLooks(Looks looks) {
        this.looks = looks;
    }
    @Override
    public Object clone() throws CloneNotSupportedException {
        Object o = super.clone();
        return o;
    }
    @Override
    public String toString(){
        return "weight"+":"+weight+"  "+looks;
    }
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person();
        person1.setWeight(100);
        person1.setLooks(new Looks("漂亮"));
        Person person2 = (Person) person1.clone();
        System.out.println(person1);
        System.out.println(person2);
        person1.getLooks().setLook("丑的");
        System.out.println(person1);
        System.out.println(person2);
    }
}
weight:100  look:漂亮
weight:100  look:漂亮
weight:100  look:丑的
weight:100  look:丑的

          从执行结果可以看出,在对Person中的Looks属性进行更改时,Person1和Person2的Looks属性都发生了变化,所以对于Person内部的Looks属性并没有进行复制,所以为浅层复制

深层复制:

对Person类的clone()方法重写如下:

    @Override
    public Object clone() throws CloneNotSupportedException {
        Looks looks = new Looks("漂亮");
        Person o = (Person) super.clone();
        o.looks = (Looks) looks.clone();
        return o;
    }

再次执行main方法时,执行结果如下:

weight:100  look:漂亮
weight:100  look:漂亮
weight:100  look:丑的
weight:100  look:漂亮

充分说明对Person类中的Look属性也进行了复制,所以称为深层复制

猜你喜欢

转载自blog.csdn.net/qq_41895761/article/details/87913362