首页 > 编程笔记 > Java笔记 阅读:11

Java clone()复制对象(附带实例)

复制操作又称为拷贝、克隆等,科幻片中经常可以看到克隆人,这些克隆人都是由某个个体通过克隆技术生成的。

在 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 指向同一个对象,并非复制对象

相关文章