Java的浅克隆与深克隆

          目录

克隆的定义:

浅克隆的定义:

深克隆的定义:

浅克隆和深克隆的区别:

浅克隆内存分布:

深克隆内存分布:

浅克隆代码:

运行结果:

深克隆代码:

运行结果:


浅克隆和深克隆

克隆的定义:

 对像的复制 

浅克隆的定义:

浅克隆指的是单纯地对对象进行低层次的复制,“低”主要体现在在复制对象时,对象中的引用没有重新开辟空间,而是将新的引用指向原来的的内容。

深克隆的定义:

深克隆指的是对对象进行彻底的复制,对所有引用重新开辟空间,复制产生的对象完全独立于原对象,两者没有任何联系,互不影响。

浅克隆和深克隆的区别:

是否对所有引用数据成员开辟新的堆区空间,以具体的Person对象per1克隆为例:

                                                        Person类的UML图和内存分布图

                                                          

                                                     现有一个Person对象per1,其内存分布如下图:  

                                                              现对其进行浅克隆和深克隆

浅克隆内存分布:

                                                                        复制后的对象命名为per2

根据内存分布可见per1和per2共用一个head,head没有被复制(更不用谈head中的引用brainstem了)。浅克隆只是将per2中的引用指向了内存中原来的head,通过per1或per2对head进行修改都会修改"对方中的head“的值.

深克隆内存分布:

                                                                          复制后的对象命名为per2

根据内存分布图可见per2对per1的复制不仅head开辟了新的空间,同时它的二级引用brainstem也开辟了新的空间。深克隆保证了克隆后的对象完全独立于原对象,两者不会相互影响。如:对per1的head进行修改不会修改per2中的head的值。

浅克隆代码:

public class tests {
    public static void main(String[] args) throws CloneNotSupportedException {
        person p1 = new person("我头上有犄角", new head("per1的头", new brainstem("per1的脑干")));
        person p2 = (person) p1.clone();
        System.out.println("修改前");
        p1.printInfo();
        p2.printInfo();
        p2.name = "我身后有尾巴";
        p2.h.name = "per2的头";
        p2.h.brain.name = "per2的脑干";
        System.out.println("修改后");
        p1.printInfo();
        p2.printInfo();
    }
}

class brainstem {
    String name;

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

}

class head {
    String name;
    brainstem brain;

    public head(String name, brainstem brain) {
        this.name = name;
        this.brain = brain;
    }
}

class person implements Cloneable {
    String name;
    head h;

    public person(String name, head day) {
        this.name = name;
        this.h = day;
    }

    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public void printInfo() {
        System.out.println(this.name+" "+this.h.name+" "+this.h.brain.name);
    }
}

运行结果:

修改per2导致per1和per2中的值都被修改了

深克隆代码:

public class test {
    public static void main(String[] args) throws CloneNotSupportedException {
        person p1 = new person("我头上有犄角", new head("per1的头", new brainstem("per1的脑干")));
        person p2 = (person) p1.clone();
        System.out.println("修改前");
        p1.printInfo();
        p2.printInfo();
        p2.name = "我身后有尾巴";
        p2.h.name = "per2的头";
        p2.h.brain.name = "per2的脑干";
        System.out.println("修改后");
        p1.printInfo();
        p2.printInfo();
    }
}

class brainstem implements Cloneable {
    String name;

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

    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

class head implements Cloneable {
    String name;
    brainstem brain;

    public head(String name, brainstem brain) {
        this.name = name;
        this.brain = brain;
    }

    public Object clone() throws CloneNotSupportedException {
        head temp = (head) super.clone();
        temp.brain = (brainstem) this.brain.clone();
        return temp;
    }
}

class person implements Cloneable {
    String name;
    head h;

    public person(String name, head day) {
        this.name = name;
        this.h = day;
    }

    public Object clone() throws CloneNotSupportedException {
        person temp = (person) super.clone();
        temp.h = (head) this.h.clone();
        return temp;
    }

    public void printInfo() {
        System.out.println(this.name+" "+this.h.name+" "+this.h.brain.name);
    }
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值