English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Wichtigkeit der clone() Methode in Java?

Dasclone() Das Methode wird verwendet, um eine Kopie eines Objekts einer implementierten Klasse zu erstellenCloneable Das InterfaceKopieren nach Feldern Weil die Klasse Object keine Kenntnis über die spezifische Klasse hat, die die Methode auf das Objekt aufruft, gibt es keine Informationen über die Mitgliedsvariablen der spezifischen Klasse. Daher wird eine neue Kopie des Objekts erstellt, wenn die Klasse nur primäre DatenTyp-Mitglieder hat, und eine Referenz auf die neue Kopie des Objekts wird zurückgegeben. Wenn die Klasse jedoch Mitgliedsvariablen von Klassenarten enthält, werden nur die Referenzen auf diese Mitgliedsvariablen kopiert, sodass die Mitgliedsreferenzen sowohl im ursprünglichen als auch im geklonten Objekt auf dasselbe Objekt verweisen.

如果尝试在未实现Cloneable 接口的类的对象上调用clone()方法,则将获得CloneNotSupportedException 。该接口是标记接口,并且该接口的实现仅表示可以在实现类的对象上调用Object.clone()方法。

语法

protected Object clone() throws CloneNotSupportedException

我们可以通过clone()两种方式实现该方法

浅拷贝

如果该类也具有非原始数据类型成员,则这是Object.clone()方法提供的默认克隆功能的结果。在“浅复制”的情况下,克隆的对象还引用与原始对象所引用的对象相同的对象,因为仅复制对象引用而不复制对象。

示例

public class ShallowCopyTest {
   public static void main(String args[]) {
      A a1 = new A();
      A a2 = (A) a1.clone();
      a1.sb.append("w3codebox!");
      System.out.println(a1);
      System.out.println(a2);
   }
}
class A implements Cloneable {
   public StringBuffer sb = new StringBuffer("Welcome to ");
      public String toString() {
         return sb.toString();
      }
   public Object clone() {
      try {
         return super.clone();
      } catch(CloneNotSupportedException e) {
      }
      return null;
   }
}

Ausgaberesultat

Willkommen bei w3codebox!
Willkommen bei w3codebox!


深拷贝

对于具有非原始类型成员的类,我们需要重写clone() 方法以实现Deep Copy,因为它也需要克隆成员对象,而默认的克隆机制无法做到这一点。

示例

public class DeepCopyTest {
   public static void main(String args[]) {
      A a1 = new A();
      A a2 = (A) a1.clone();
      a1.sb.append(" w3codebox!");
      System.out.println(a1);
      System.out.println(a2);
   }
}
class A implements Cloneable {
   public StringBuffer sb = new StringBuffer("Welcome to ");
   public String toString() {
      return sb.toString();
   }
   public Object clone() {
      try {
         A a = (A) super.clone();
         a.sb = new StringBuffer(sb.toString());
         return a;
      }
      catch(CloneNotSupportedException e) {
      }
      return null;
   }
}

Ausgaberesultat

Willkommen bei w3codebox!
Willkommen