码迷,mamicode.com
首页 > 其他好文 > 详细

clone

时间:2018-02-11 18:16:00      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:exception   copy   als   语言   cat   post   student   blog   反序列化   

参考文档:
深拷贝&浅拷贝:http://blog.csdn.net/cws1214/article/details/52193341

克隆的分类:
  (1)浅克隆(shallow clone),浅拷贝是指拷贝对象时仅仅拷贝对象本身和对象中的基本变量,而不拷贝对象包含的引用指向的对象。
  (2)深克隆(deep clone),深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。

克隆的实现:
  1. 让该类实现java.lang.Cloneable接口;
  2. 重写(override)Object类的clone()方法。
(该方法是浅克隆,如果需要实现深克隆,则需要重写clone方法)

clone()满足的条件:
 clone()方法将对象复制了一份并返还给调用者。所谓“复制”的含义与clone()方法是怎么实现的。一般而言,clone()方法满足以下的描述:
  (1)对任何的对象x,都有:x.clone()!=x。换言之,克隆对象与原对象不是同一个对象。
  (2)对任何的对象x,都有:x.clone().getClass() == x.getClass(),换言之,克隆对象与原对象的类型一样。
  (3)如果对象x的equals()方法定义其恰当的话,那么x.clone().equals(x)应当成立的。
  在JAVA语言的API中,凡是提供了clone()方法的类,都满足上面的这些条件。JAVA语言的设计师在设计自己的clone()方法时,也应当遵守着三个条件。一般来说,上面的三个条件中的前两个是必需的,而第三个是可选的。

为什么Object类的clone()方法是浅拷贝:

  1. 效率和简单性,简单的copy一个对象在堆上的的内存比遍历一个对象网然后内存深copy明显效率高并且简单
  2. 不给别的类强加意义。如果A实现了Cloneable,同时有一个引用指向B,如果直接复制内存进行深copy的话,意味着B在意义上也是支持Clone的,但是这个是在使用B的A中做的,B甚至都不知道。破坏了B原有的接口
  3. 有可能破坏语义。如果A实现了Cloneable,同时有一个引用指向B,该B实现为单例模式,如果直接复制内存进行深copy的话,破坏了B的单例模式
  4. 更灵活,如果A引用一个不可变对象,则内存deep copy是一种浪费。Shadow copy给了程序员更好的灵活性。

创建对象的几种方式:

  • new:new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕
  • 反射

   a:Student  stu = (Student)Class.forName("根路径.Student").newInstance()
   b:Student stu = Student.class.newInstance()
区别:
  > Class类的newInstance只能触发无参数的构造方法创建对象,而构造器类的newInstance能触发有参数或者任意参数的构造方法来创建对象。
  > Class类的newInstance需要其构造方法是共有的或者对调用方法可见的,而构造器类的newInstance可以在特定环境下调用私有构造方法来创建对象。
  > Class类的newInstance抛出类构造函数的异常,而构造器类的newInstance包装了一个InvocationTargetException异常。

  • clone

       先分配内存,将原来对象内存里的内容copy一份。不会调用构造方法

  • 反序列化



clone

标签:exception   copy   als   语言   cat   post   student   blog   反序列化   

原文地址:https://www.cnblogs.com/amei0/p/8442183.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!