对象的拷贝是创建一个对象的精确副本的方法。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()方法。

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想