java语言之Cloneable接口

在我们学习过程中,会发现java很多非常重要的接口,比如Cloneable,Serializable,Comparable等等之类的,今天我就总结一下Cloneable接口。

我学习到现在觉得最好的学习资源就是源码以及源码的注释,任何其他的都是对源码的翻译和解读,现在我就说说我对源码及注释的理解,如何大家想从源头上获取,建议大家看Cloneable接口和Object中的clone()方法。

正文:

1.如果一个对象要实现拷贝,就必须要实现Cloneable接口,只有实现了该接口,该类的对象采用拷贝的能力,否则调用clone()是会抛出CloneNotSupportedException异常

2.拷贝分为浅拷贝和深拷贝

浅拷贝是拷贝的默认方式(逐个field拷贝),只适用于基本数据类型和不可变类型(如String)

深拷贝是适用于有引用成员变量的情形,因为浅拷贝在拷贝应用成员变量时只是拷贝了引用,所以要自己特别处理,若不处理拷贝出来的对象都是公用一块内存(一变都变)

例子:

浅拷贝:

public class Resume_ShallowCopy implements Cloneable {
    private String name;
    private String sex;
    private String age;
    private String timeArea;
    private String company;

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

    public void setPersonalInfo(String sex, String age) {
        this.sex = sex;
        this.age = age;
    }

    public void setWorkExperience(String timeArea, String company) {
        this.timeArea = timeArea;
        this.company = company;
    }

    public void display() {
        System.out.println(name + ", " + sex + ", " + age);
        System.out.println("工作经历:" + timeArea + ", " + company);
        System.out.println(age.hashCode());
        System.out.println();
    }
}

深拷贝:

public class Resume_DeepCopy implements Cloneable {
    private String         name;
    private String         sex;
    private String         age;

    private WorkExperience work; // 引用类型

    public Resume_DeepCopy(String name) {
        this.name = name;
        work = new WorkExperience();
    }

    public Resume_DeepCopy(WorkExperience work) throws CloneNotSupportedException {
        this.work = (WorkExperience) work.clone();
    }

    public void setPersonalInfo(String sex, String age) {
        this.sex = sex;
        this.age = age;
    }

    public void setWork(String workDate, String company) {
        work.setWorkDate(workDate);
        work.setCompany(company);
    }

    public void display() {
        System.out.println(name + ", " + sex + ", " + age);
        System.out.println("工作经历:" + work.getWorkData() + " " + work.getCompany());
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Resume_DeepCopy obj = new Resume_DeepCopy(work);//把work拷贝一下
        obj.name = name;// 逐个拷贝
        obj.sex = sex;
        obj.age = age;
        return obj;
    }
}


引用类型:

public class WorkExperience implements Cloneable {
    private String workDate;
    private String company;

    public String getWorkData() {
        return workDate;
    }

    public void setWorkDate(String workData) {
        this.workDate = workData;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

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


Main:

public class Console {
    public static void main(String[] args) throws CloneNotSupportedException {
        Resume_DeepCopy a = new Resume_DeepCopy("大鸟");
        a.setPersonalInfo("男", "29");
        a.setWork("1998-2000", "XX公司");

        Resume_DeepCopy b = (Resume_DeepCopy) a.clone();
        b.setWork("1998-2006", "YY企业");

        Resume_DeepCopy c = (Resume_DeepCopy) a.clone();
        c.setPersonalInfo("男", "24");
        c.setWork("1998-2003", "ZZ企业");

        a.display();
        b.display();
        c.display();
    }
}

拷贝还设计到一个设计模式:原型模式~~~ 有兴趣自己看~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

apple_51426592

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值