Java clone()复制对象(附带实例)
复制操作又称为拷贝、克隆等,科幻片中经常可以看到克隆人,这些克隆人都是由某个个体通过克隆技术生成的。
在 Java 程序中,我们可以通过类来创建对象,如果再想生成一个一模一样的对象就需要通过复制来实现,复制出的对象的内部属性和方法都与原来的对象完全相同。
最原始最朴素的复制方式就是创建一个与已知对象一模一样的对象。例如:
虽然原始的复制方式理解起来很简单,但它比较烦琐,每次复制时都需要创建新对象,并且手动去设置对象的属性。为了更好地解决对象复制的问题,Java 提供了一个 clone() 方法。
clone() 方法属于 Object 类,由于所有 Java 类都会默认继承该类,因此所有 Java 对象都能调用 clone() 方法。
通过 clone() 方法实现克隆需要完成两步,看下面的实例:
最后我们再来看一个实例,并思考是不是复制:

图 1 指向同一个对象,并非复制对象
在 Java 程序中,我们可以通过类来创建对象,如果再想生成一个一模一样的对象就需要通过复制来实现,复制出的对象的内部属性和方法都与原来的对象完全相同。
最原始最朴素的复制方式就是创建一个与已知对象一模一样的对象。例如:
public class ObjectCloneTest { public static void main(String[] args) { Person p1 = new Person("小明", 16); Person p1Copy = new Person("小明", 16); Person p1Copy2 = new Person(); p1Copy2.setName("小明"); p1Copy2.setAge(16); } } class Person { String name; int age; Person() { } Person(String name, int age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } }对于对象 p1 来说,如果想克隆一个 p1 的副本,就可以通过“new Person("小明", 16);”直接创建一个 p1Copy 对象,此时该对象内部的 name 属性和 age 属性都与 p1 对象的相同。当然,也可以先通过“new Person();”创建一个对象后再借助 setName() 和 setAge() 方法设置对应属性的值。
虽然原始的复制方式理解起来很简单,但它比较烦琐,每次复制时都需要创建新对象,并且手动去设置对象的属性。为了更好地解决对象复制的问题,Java 提供了一个 clone() 方法。
clone() 方法属于 Object 类,由于所有 Java 类都会默认继承该类,因此所有 Java 对象都能调用 clone() 方法。
通过 clone() 方法实现克隆需要完成两步,看下面的实例:
class Person implements Cloneable { //... public Object clone() { try { return super.clone(); } catch (Exception e) { return null; } } }以程序中的 Person 类为例,第一步必须实现 Cloneable 接口,第二步添加一个 clone() 方法,注意它只是调用了父类(Object 类)的 clone() 方法并处理异常。这样定义后就可以通过“Person p1C = (Person) p1.clone();”来实现对象的复制。
最后我们再来看一个实例,并思考是不是复制:
public class ObjectCloneTest2 { public static void main(String[] args) { Person p1 = new Person("小明", 16); Person p1Copy = p1; } }程序中先创建一个 Person 对象 p1,然后声明另一个 Person 对象 p1Copy 并将 p1 赋值给它。实际上这并不是复制,而是将 p1 变量和 p1Copy 变量都指向同一个 Person 对象,如下图所示。

图 1 指向同一个对象,并非复制对象