讲解java克隆作用_详细讲解Java中的对象克隆

1b886e01fb6cf6771d2069176464ece5.png

首先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗?

克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。那么我把这个对象的临时属性一个一个的赋值给我新new的对象不也行嘛?可以是可以,但是一来麻烦不说,二来,clone方法最终将调用JVM中的原生方法完成复制也就是调用底层的c++代码,所以一般使用clone方法复制对象要比新建一个对象然后逐一进行元素复制效率要高,因为是在底层实现的。

2.实现对象克隆[clone]有两种方式:

1). 实现Cloneable接口并重写Object类中的clone()方法;

2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。对象序列化后写入流中,再从流中读取,生成新对象,新对象和原对象之间也是完全互不影响的.

1) 浅克隆

1. 被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常), 该接口为标记接口(不含任何方法)

2.  覆盖clone()方法,方法中调用super.clone()方法得到需要的复制对象。

1c15583fdd7a842f6ace2f086a8400cf.png

2) 深克隆

1. 被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常), 该接口为标记接口(不含任何方法)

2.  覆盖clone()方法,方法中调用super.clone()方法得到需要的复制对象。

3. 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。对象序列化后写入流中,再从流中读取,生成新对象,新对象和原对象之间也是完全互不影响的.

5b60389873856e1f893670d9260ae9b9.png

3. 浅克隆 和 深克隆的区别

浅克隆:   创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址(则表示 浅克隆仅仅复制所考虑的对象,而不复制它所引用的对象 )。

35440585e5db6f8915e6fa3514b7b2bd.png

深克隆 :   创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

fea78e382332a9b46486d0367744f5a9.png

总结 :

实现对象克隆有两种方式:

1. 实现Cloneable接口并重写Object类中的clone()方法;

2. 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆.

注意 :

基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是否支持序列化,这项检查是编译器完成的,不是在运行时抛出异常,这种是方案明显优于使用Object类的clone方法克隆对象。让问题在编译的时候暴露出来总是优于把问题留到运行时。

这就是小喵结合自己所学的知识联合网上查找到的相关内容所总结的知识整理了,

如果觉得小喵的总结对你有帮助的话,

请留下你的足迹吧!

(^_^)~喵~!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值