详细讲解Java中的对象克隆
  TEZNKK3IfmPf 2023年11月14日 22 0

1.为什么要用克隆 [clone]

        首先思考一个问题,为什么需要克隆对象?直接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()方法得到需要的复制对象

详细讲解Java中的对象克隆

            2) 深克隆

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

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

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

详细讲解Java中的对象克隆

 

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

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

详细讲解Java中的对象克隆

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

详细讲解Java中的对象克隆

总结 : 

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

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

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

 注意 : 

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   19天前   43   0   0 java
  TEZNKK3IfmPf   2024年05月31日   54   0   0 java
TEZNKK3IfmPf