📜  Java 对象clone

📅  最后修改于: 2020-09-24 00:36:46             🧑  作者: Mango

Java中的对象克隆

对象克隆是一种创建对象的精确副本的方法。Object类的clone()方法用于克隆对象。

java.lang.Cloneable接口必须由我们要创建其对象克隆的类实现。如果我们不实现Cloneable接口,则clone()方法将生成CloneNotSupportedException。

clone()方法在Object类中定义。clone()方法的语法如下:

protected Object clone() throws CloneNotSupportedException  

为什么要使用clone()方法?

clone()方法节省了用于创建对象的精确副本的额外处理任务。如果使用new关键字执行此操作,则将花费大量处理时间,这就是我们使用对象克隆的原因。

对象克隆的优势

尽管Object.clone()存在一些设计问题,但是它仍然是复制对象的一种流行且简便的方法。以下列出了使用clone()方法的优点:

  • 您无需编写冗长和重复的代码。只需将抽象类与4或5行长clone()方法一起使用。
  • 这是复制对象的最简单,最有效的方法,尤其是当我们将其应用于已开发或旧项目时。只需定义一个父类,在其中实现Cloneable,提供clone()方法的定义即可完成任务。
  • Clone()是复制数组的最快方法。

对象克隆的缺点

以下列出了clone()方法的一些缺点:

  • 要使用Object.clone()方法,我们必须更改代码的语法,例如实现Cloneable接口,定义clone()方法和处理CloneNotSupportedException,最后调用Object.clone()等。
  • 当它没有任何方法时,我们必须实现可克隆的接口。我们只需要使用它来告诉JVM我们可以对对象执行clone()。
  • Object.clone()受保护,因此我们必须提供自己的clone()并从中间接调用Object.clone()。
  • Object.clone()不会调用任何构造函数,因此我们无法控制对象的构造。
  • 如果要在子类中编写一个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){}  
  }  
}  

如上例所示,两个引用变量具有相同的值。因此,clone()将一个对象的值复制到另一个对象。因此,我们无需编写显式代码即可将一个对象的值复制到另一个对象。

如果我们通过new关键字创建另一个对象,并将另一个对象的值分配给该对象,则将需要对该对象进行大量处理。因此,为了节省额外的处理任务,我们使用clone()方法。