关于Clonable接口的深拷贝和浅拷贝

前言

大家好,我是Maybe。昨天学了Clonable接口。着重学了深拷贝与浅拷贝。我想跟大家分享一下,一方面是为了加深自己对于这个知识的理解,另一方面是如果大家需要了解相关方面的知识,希望可以帮助大家。

举例代码如(先说浅拷贝)

package demo1;

public class Money implements Cloneable {
    public double money=9.9;
    @Override
    protected Object clone() throws CloneNotSupportedException {//1.重写父类Object的方法
        return super.clone();
    }
}
package demo1;

public class Person implements Cloneable{
    public int age;
    public double score;
    public String name;
    public Money money=new Money();

    public Person(int age, double score, String name) {
        this.age = age;
        this.score = score;
        this.name = name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {//1.重写父类Object的方法
        return super.clone();
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", score=" + score +
                ", name='" + name + '\'' +
                '}';
    }
}
package demo1;

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {//2.抛出异常
        Person person1=new Person(2,90.9,"qq");
        Person person2=(Person) person1.clone();//3.向下转型
        System.out.println(person1.money.money);
        System.out.println(person2.money.money);
        System.out.println("========");
        person2.money.money=19.9;
        System.out.println(person1.money.money);
        System.out.println(person2.money.money);
    }
}

运行结果如下

 

通过运行结果,我们可以知道修改person2.money.money的值,也会将person1.money.money的值改变。这种就被称为浅拷贝。

画图分析如下

 

深拷贝 

特此说明,深拷贝只需要把上面的Person类进行修改即可,Test类,Money类不变。

代码如下

package demo1;

public class Person implements Cloneable{
    public int age;
    public double score;
    public String name;
    public Money money=new Money();

    public Person(int age, double score, String name) {
        this.age = age;
        this.score = score;
        this.name = name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {//1.重写父类Object的方法
//        return super.clone();
        Person tmp=(Person) super.clone();
        tmp.money=(Money) this.money.clone();
        return tmp;
    }//这里修改了,有浅拷贝变为深拷贝

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", score=" + score +
                ", name='" + name + '\'' +
                '}';
    }
}

运行结果如下

 

分析如下 

 

 

 

结语 

本次分享就到此为止啦。希望大家喜欢,下次见啦!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值