java中关于Cloneabale接口的拷贝和深拷贝

拷贝的定义

当我们创建了一个类,依旧还是那个熟悉的学生类。现在我想把它拷贝出来,可能首先出来的就是创建一个学生对象然后一次的引用进行赋值,行,但是复杂了。接下来我们的Cloneabale闪亮登场了,它是个接口,里面没有内容,但是用到它的类就说明是可以被clone的。
然后直接上代码
class Student implements Cloneable{
public String name;
public Student(String name){
this.name=name;
}
@Override
public String toString() {
return “Student{” +
“name='” + name + ‘’’ +
‘}’;
}
}
既然要克隆,就得有clone呀,所以得重写clone函数,?不是刚刚说Clonebale中啥也没吗
在这里插入图片描述
按住Ctrl然后点击Cloneable查看,确实什么也没,因为object是所有官方类的父类,所以这里要重写的clone是来自Cloneable的父类的。
后面抛出的异常为编译异常,需要进行处理,等下面看主函数是怎么操作的就行
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
准备工作做完了,接下来就是进行调用函数了
将上面抛出的异常直接复制到这
public static void main(String[] args) throws CloneNotSupportedException {
Student student=new Student(“zhansan”);
//这里需要做的是进行强制类型转换,属于一个向下转型,clone返回的为一个object类型,所以需要强制转换,具体的Ctrl加点击去看吧
Student student1=(Student) student.clone();
}
接下来输出所创建的两个对象就行了
输出你会发现你的对象2已结克隆到了对象1,然后对对象2的值进行修改,你会发现对象1的值依旧是对象1的值。
student1.name=“lisi”;
在这里插入图片描述
可以看出,对象2的修改对对象1是没有影响的。

深拷贝

那什么是深拷贝呢?
我们再创建一个money类,并且在学生类里面进行new一个对象去引用里面的money下面看代码
class Money implements Cloneable{
public double money=12.25;
}
然后在学生类里面引用它
public Money m=new Money();
然后再次运行对两个对象引用到的m.money进行输出,
在这里插入图片描述
都是12.5,然后我们对对象2的m.money进行修改。输出发现对象1的值也被修改了。这是怎么回事呢?
重新来理解一下克隆这个对象吧,刚开始我们对name进行操作的时候,对象2的改变是不会影响对象1的值的,所以我们的name所划分的空间是克隆成功了的,但是我们m所开辟空间里面的money好像并没有克隆,还是用的同一个地址。这时候就需要我们的深拷贝了,上代码:
class Money implements Cloneable{
public double money=12.25;
//重写clone方法
//代表着Money就可以被克隆了
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Student implements Cloneable{
public String name;
public Money m=new Money();
public Student(String name){
this.name=name;
}
@Override
public String toString() {
return “Student{” +
“name='” + name + ‘’’ +
‘}’;
}
//再次运行发现Money还是未被克隆,根本没有用它这是因为
//以下函数返回的为objec类,掉用的是父类的克隆
//所以还需在此将m.出的对象进行克隆
@Override
protected Object clone() throws CloneNotSupportedException {
Student student=(Student) super.clone();
student.m=(Money) this.m.clone();
return student;
}
}
这样做后再次运行,对象2修改的money就不会影响对象1中的money了
student1.m.money=13;
System.out.println(student.m.money);
System.out.println(student1.m.money);
在这里插入图片描述
好了,总结一下。克隆是对当前类里面的对象就行克隆,若当前对象又开辟了新的类,这时候若需要另一个值,则就需要深拷贝了。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ShengR_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值