浅谈Java克隆

栏目: Java · 发布时间: 6年前

内容简介:何谓深浅?程度而已。被克隆的类实现然后,克隆时只须调用我们刚刚覆盖的

何谓深浅?程度而已。

克隆:复制一份

被克隆的类实现 Cloneable 接口,覆盖 clone() 方法,返回调用父类的 clone() 即可。

public class Person implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException { 
        return super.clone();
    }
    //...省略其余代码
}

然后,克隆时只须调用我们刚刚覆盖的 clone()

浅拷贝

现在有 Child 类:

public class Child{
    //...省略其余代码
}

还有 Person 类:

public class Person implements Cloneable{
    
    private int age;
    private String name;
    private Child child;
    //...省略其余代码
}

克隆Person对象p1赋给p2,然后我们看看他们的 toString()hashCode() 结果:

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
        Person p1 = new Person("zhangsan",23);
        p1.setChild(new Child("xiaoming", 1););
        //克隆操作
        Person p2 = p1.clone();
        //打印看看
        System.out.println(p1+", "+p1.hashCode()+", "+p1.getChild().hashCode());
        System.out.println(p2+", "+p2.hashCode()+", "+p2.getChild().hashCode());
    }
}

输出:

Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=1]], 118352462, 1550089733
Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=2]], 865113938, 1550089733

结论:p1,p2成员的值相等,但它们是两个不同的对象,他们的Child成员是同一个对象。

深拷贝

Child 也实现 Cloneable 接口并覆盖 clone()

public class Child implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();;
    }
    //...省略其余代码
}

然后,改变 Person 类的 clone() 的实现:

public class Person implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person p = (Person)super.clone();
        p.setChild((Child)child.clone());
        return p;
    }
     //...省略其余代码
}

然后再调用上面的 main(String [] args) ,结果是:

Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=1]], 118352462, 1550089733
Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=2]], 865113938, 1442407170

结论:p1,p2是两个不同的对象,他们的Child成员也是两个不同的对象。

总结

克隆就是复制一份。

浅拷贝就是简单复制值,如果有引用成员,他们的引用成员将是同一个对象,深拷贝则不为然。

为什么呢

可以这样认为,调用谁的 clone() 就是就是对谁深拷贝。

在上面浅拷贝的例子中,因为调用了 p1 对象的 clone() ,所以 p1p2 是两个不同的对象(对p1,p2本身深拷贝);在深拷贝的例子中,不但调用了 p1clone() ,也调用 Child 类型对象的 clone() ,所以两个 Child 类型对象不同(对所有对象深拷贝)。

思考

基于上述例子,如何实现 Person 类的 clone() ,使得只对 Child 成员进行深拷贝,而不对 Person 本身深拷贝?


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

趋势红利

趋势红利

刘润 / 文化发展出版社(原印刷工业出版社) / 2016-6-1 / 45.00

【编辑推荐】 1、国内顶尖的互联网转型专家,海尔、百度等知名企业战略顾问刘润送给传统企业的转型、创新“导航仪”,这个时代企业家的必修课 站在近200年商业全景图角度,刘润发现三种企业类型(产品型、渠道型、营销型),针对不同企业类型定制转型战略(找到自己的未来红利),方便 传统企业对号入座:不走错路就是节省时间,适合自己的最有效率。 本书内容还源自芬尼克兹、红领集团、名创优品、必要......一起来看看 《趋势红利》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具