Java教程-Java 中的对象拷贝

对象的拷贝是创建一个对象的精确副本的方法。Java中,可以使用Object类的clone()方法进行对象拷贝。
要实现对象的拷贝,我们的类必须实现java.lang.Cloneable接口。如果我们不实现Cloneable接口,clone()方法会抛出CloneNotSupportedException异常。
clone()方法是在Object类中定义的,其语法如下所示:
protected Object clone() throws CloneNotSupportedException
为什么要使用clone()方法?
使用clone()方法可以节省创建对象副本的额外处理。如果使用new关键字来创建副本,将会消耗大量的处理时间,因此使用对象拷贝是一个更好的选择。
对象拷贝的优势
尽管Object.clone()存在一些设计问题,但它仍然是一种流行且简单的复制对象的方法。以下是使用clone()方法的一些优点:
- 无需编写冗长且重复的代码。只需要在一个抽象类中使用clone()方法,就可以实现只有4或5行代码量的对象拷贝。
- 这是拷贝对象最简单和高效的方法,特别适用于已经开发或旧项目。只需要定义一个父类,在其中实现Cloneable接口并提供clone()方法的定义即可完成任务。
- clone()方法是拷贝数组的最快方法。
对象拷贝的缺点
以下是clone()方法的一些缺点:
- 要使用Object.clone()方法,需要对代码进行多处语法上的更改,如实现Cloneable接口、定义clone()方法、处理CloneNotSupportedException异常,最后调用Object.clone()等。
- 必须实现Cloneable接口,尽管它本身没有任何方法。我们只需使用它来告诉JVM我们可以在对象上执行clone()操作。
- Object.clone()是受保护的,因此必须提供自己的clone()方法并间接调用Object.clone()。
- Object.clone()不调用任何构造函数,因此无法控制对象的构造过程。
- 如果想在子类中编写一个拷贝方法,那么所有超类都必须在它们自己中定义clone()方法,或者从另一个父类继承该方法。否则,super.clone()链将中断。
- Object.clone()只支持浅拷贝,如果需要深拷贝,就需要对其进行覆盖。
clone() 方法示例(对象拷贝)
让我们看一下对象拷贝的简单示例
class Student18 implements Cloneable{
int rollno;
String name;
Student18(int rollno,String name){
this.rollno=rollno;
this.name=name;
}
public Object clone()throws CloneNotSupportedException{
return super.clone();
}
public static void main(String args[]){
try{
Student18 s1=new Student18(101,"amit");
Student18 s2=(Student18)s1.clone();
System.out.println(s1.rollno+" "+s1.name);
System.out.println(s2.rollno+" "+s2.name);
}catch(CloneNotSupportedException c){}
}
}
输出:
101 amit
101 amit
正如您在上面的示例中所看到的,两个引用变量具有相同的值。这表明clone()方法将一个对象的值复制到另一个对象中。因此,我们不需要编写显式的代码来将一个对象的值复制到另一个对象中。
如果我们使用new关键字创建另一个对象,并将一个对象的值赋给它,那么就需要进行大量的处理。为了避免这种额外的处理任务,我们使用clone()方法。