一为什么要使用clone在实际编程过程中我们常常遇到这种情况有一个对象 A需要一个和 A 完全相同新对象 B并且此后对 B 任何改动都不会影响到 A 中的值也就是说A 与 B 是两个独立的对象但 B 的初始值是由 A 对象确定的。在 Java 语言中用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径但实现 clone方法是其中最简单也是最高效的手段。二new和clone的区别new• 通过调用类的构造函数来创建新对象实例这意味着可以定义对象的初始化状态• 根据对象类型明确分配相应大小的内存空间• 需要显式初始化通常在构造函数中完成• 涉及内存分配、构造函数调用和初始化可能在复杂对象中相对较慢• 不依赖已有对象每次创建都是全新的实例• 无需实现任何特殊接口• 用于全新创建对象实例无历史状态需求• 生成完全独立的对象互不影响clone• 不会调用构造函数而是复制已有对象的属性适用于快速创建一个具有相似状态的对象• 分配内存给新对象并且大小与原对象相同• 继承了原对象的初始化状态不需要再次初始化• 通常认为较快因为避免了构造函数调用和逐步初始化但具体取决于JVM实现和场景• 必须有一个原对象作为克隆的基础• 需要实现Cloneable接口并重写clone()方法否则会抛出CloneNotSupportedException异常• 用于基于现有对象快速生成一个副本例如保存当前状态进行操作或比较• 虽然生成的是一个新对象但如果涉及到引用类型字段则需要深拷贝处理否则可能存在依赖三 复制对象和复制引用的区别四浅拷贝和深拷贝在Java编程中clone()方法提供了一种创建对象副本的方式。通过实现Cloneable接口并重写clone()方法我们可以轻松地创建一个对象的完整复制品。然而关于使用clone()方法存在许多细节和注意事项尤其是在处理浅克隆shallow copy与深克隆deep copy时。本篇博客将深入探讨这一主题。在Java中所有对象都继承自Object类其中包含一个clone()方法但该方法是受保护的protected意味着我们不能直接在非子类外部调用它。为了使得clone()方法可用我们需要实现Cloneable接口该接口是一个标记接口marker interface本身不包含任何方法说明这个类可拷贝。实现Cloneable接口后我们可以通过重写clone()方法来提供自定义的复制逻辑。如果不重写clone()方法对象将获得一个默认的浅复制行为这意味着基本字段将被复制但引用类型字段将只复制引用而不是引用的对象浅拷贝protected Object clone() throws CloneNotSupportedException {return super.clone();}}可以看到后面需要加上一个抛异常的代码而且clone返回类型是Object深拷贝protected Object clone() throws CloneNotSupportedException {//return super.clone();Person tmp (Person) super.clone();tmp.m (Money) this.m.clone();return tmp;}class Money implements Cloneable{public double money 19.9;Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}}class Person implements Cloneable{public int age;public Money m;public Person(int age) {this.age age;this.m new Money();}Overrideprotected Object clone() throws CloneNotSupportedException {//return super.clone();Person tmp (Person) super.clone();tmp.m (Money) this.m.clone();return tmp;}Overridepublic String toString() {return Person{ age age };}}public class Test2 {public static void main(String[] args) throws CloneNotSupportedException {Person person1 new Person(10);Person person2 (Person)person1.clone();System.out.println(person1.m.money);System.out.println(person2.m.money);System.out.println();person2.m.money 99.99;System.out.println(person1.m.money);System.out.println(person2.m.money);}}