米鼠商城

多快好省,买软件就上米鼠网

最新项目

人才服务

靠谱的IT人才垂直招聘平台

详细讲解Java中的对象克隆

  • Ellison
  • 7
  • 2020-05-23 08:03

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()方法得到需要的复制对象

            2) 深克隆

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

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

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

 

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

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

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

总结 : 

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

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

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

 注意 : 

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

 

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

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

请留下你的足迹吧!

(^_^)~喵~!!

 



这里给大家推荐一个在线软件复杂项交易平台:米鼠网 https://www.misuland.com

米鼠网自成立以来一直专注于从事软件项目人才招聘软件商城等,始终秉承“专业的服务,易用的产品”的经营理念,以“提供高品质的服务、满足客户的需求、携手共创双赢”为企业目标,为中国境内企业提供国际化、专业化、个性化、的软件项目解决方案,我司拥有一流的项目经理团队,具备过硬的软件项目设计和实施能力,为全国不同行业客户提供优质的产品和服务,得到了客户的广泛赞誉。

猜你喜欢

评论留言