一、Cloneable 接口的目的是代表对象时复制的数组
二、Object 的克隆方法是受保护的安全
- 不借助于反射,仅仅实现Cloneable 接口是没法调用clone 方法的
-
三、Cloneable 接口决定了,Object 中受保护的clone方法实现的行为架构
- 若是实现了Cloneable,Object 的clone 方法返回逐域拷贝
- 不然,抛出CloneNotSupportedException 异常
- 接口的极端非典型用法,不值得效仿
- 一般状况下,实现接口是为了代表它能够为类作些什么
- Cloneable 接口改变了超类中受保护的方法的行为
- 实现了该接口,无需调用构造器就能够建立对象
四、clone方法的通用约定很是弱ide
- 拷贝的精确含义取决于,实现类自己
- 通常意义上(但不是绝对):



五、不调用构造器的规定太强硬this
- 行为良好的构造器能够由构造器建立,再复制内部对象
- 若是是final 类,甚至能够是返回一个构造器建立的对象
六、x.clone().getClass()==x.getClass() 一般状况下是true 线程
- 在子类中调用super.clone(),返回的是子类的实例
- 超类实现这种功能的惟一途径是返回一个super.clone()返回的对象
- 全部超类都遵照该规则,最后返回Object 的clone ,返回一个正确的实例(行为良好clone 方法)
- 若是返回一个构造器建立的类,就获得一个错误的实例
七、Object 的clone 方法是一个本地方法设计
- Object 的clone 方法是一个本地方法
- 执行的时候使用RTTI(run-time type identification)
- 动态获得正在调用clone方法的那个reference
- 根据它的大小申请内存空间,而后进行bitwise的复制
- 将该对象的内存空间彻底复制到新的空间中去,从而达到shallowcopy的目的
- 获得当前类的副本,不是父类
- 根本没有必用调用this.clone()
八、从超类的角度,拷贝对象是对原始对象功能的完整拷贝对象
- 基本类型和不可变类,返回对象没有问题,不须要进一步处理

永远不要让客户去作类库能够提供的事情继承
- 若是带有可变类,简单的clone 实现可能带来灾难性后果
- 下述Stack 类,若是采用简单的clone ,elements仅仅是引用复制,新老引用指向同一个数组

clone 方法是类的另外一个构造器,确保不要伤害原有对象,确保正确建立被克隆对象全部约束条件递归

数组不须要 类型转换,类型在编译时与被克隆类型是相同的
九、若是可变类存在final 的域,上述方案不能正常运行:clone 方法会被禁止赋新值
- clone 架构与引用可变对象的final 域之间自己就是冲突的
- 去掉final 再clone
十、递归调用clone 有时还不够

- 上述类,带有内部类,须要复制每个对象(深度拷贝):
- 递归调用式拷贝:

- 递归调用针对链表中每一个元素,都消耗一段栈空间
- 链表过长可能会溢出
- 迭代式拷贝避免了上述状况(迭代器能用就用啊):


十一、克隆复杂对象的最后一种方法
- 先调用super.clone 方法
- 把全部域置空
- 最后再把每一个值都填进去
- 这是一种简单、优美、合理的克隆方法
- 运行效率比直接操做对象内部状态要差
十二、clone 方法与构造器同样,clone 方法在构造过程当中,不能调用新对象任何非 final 的方法
- 新对象被拷贝出来前,不能调用它的非 final 方法
1三、覆盖版本的clone 方法不该该忽略声明可抛出异常 CloneNotSupportedException
- Object 的clone 方法可抛出 CloneNotSupportedException 异常
- 公有的覆盖版本clone 方法可省略
- 省略后使用更轻松
1四、专门为继承而设计的类<17条>,应尽可能模仿Object 的clone 方法
- (protected、可抛出上述异常)
- 不该该实现Cloneable 接口,继承类可自由选择是否实现Cloneable 接口
- 这样便直接扩展了Object
1五、线程安全的类实现 Cloneable 接口,clone 方法也必须同步
- Object 的clone 没有同步
- 使用同步的clone 方法调用super.clone()
1六、不可变类不要提供拷贝方法
1七、拷贝构造器(拷贝工厂)

优点:
- 不依赖于有风险的、对象以外的对象建立机制
- 不要求遵照还没有指定好的文档规范
- 不会与 final 域的正常使用发生冲突
- 不会抛出没必要要的受检异常
- 不须要进行类型转换
- 采用拷贝构造器没有放弃接口的功能特性(Cloneable 接口是一个空接口)
1八、拷贝构造器(拷贝工厂)能够带有一个参数:
- 参数类型是经过该类实现的接口
- 实质就是转换构造器(转换工厂)
- 好比HashSet 转换成TreeSet:new TreeSet(s)