码迷,mamicode.com
首页 > 其他好文 > 详细

深复制和浅复制

时间:2015-08-20 17:00:15      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:java

对于C语言,简单的来说就是,在有指针的情况下,浅复制只是增加了一个指针指向已经存在的内存,而深复制就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存。

由于浅复制是多个指针指向同一块内存,在释放内存的时候不小心会出现重复释放同一块内存的错误,而采用深复制则不会出现这种情况。

对于Java语言,简单的来说就是,浅复制是指复制对象时仅仅复制对象本身,而不复制对象中包含的引用类型指向的对象;深复制不仅复制对象本身,而且复制对象包含的引用所指向的对象。

下面例举一个Java的例子:

public class UselessClass {

    public static void main(String[] args) throws Exception {
        Husband husband1 = new Husband("汪峰",new Wife("章子怡"));
        //浅复制一个husband
        Husband husband2 = (Husband) husband1.clone();

        husband2.name = "马云";
        husband2.wife.name = "张瑛";

        System.out.println("丈夫的名字是:" + husband1.name + "    妻子的名字是:" + husband1.wife.name);
    }

}

class Wife implements Cloneable {
    public String name;

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

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

class Husband implements Cloneable {
    public String name;
    public Wife wife;

    public Husband(String name, Wife wife) {
        this.name = name;
        this.wife = wife;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}

上面代码输出的结果是:丈夫的名字是:汪峰 妻子的名字是:张瑛

从上面的例子我们可以看出,当我们修改husband2名字的时候,husband1的名字并没有改变。然而,修改husband2妻子名字的时候,husband1的妻子的名字却发生了改变,这足以证明浅复制仅仅复制了对象本身,而不复制对象中包含的引用类型指向的对象。

如果想要深复制,则把上面Husband中的clone方法做如下更改:

@Override
    protected Object clone() throws CloneNotSupportedException {
        Husband husband = (Husband) super.clone();
        husband.wife = (Wife) wife.clone();

        return husband;
    }

上面代码输出的结果是:丈夫的名字是:汪峰 妻子的名字是:章子怡

版权声明:本文为博主原创文章,未经博主允许不得转载。

深复制和浅复制

标签:java

原文地址:http://blog.csdn.net/xlinsist/article/details/47807511

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!