Java 中 clone() 方法的重要性?

javaobject oriented programmingprogramming更新于 2024/7/26 7:37:00

clone() 方法用于创建实现 Cloneable 接口的类的对象的副本。默认情况下,它会逐个字段复制,因为 Object 类不知道调用此方法的特定类的成员。因此,如果该类只有原始数据类型成员,则会创建该对象的新副本并返回对新对象副本的引用。但是,如果类包含任何类类型的成员,则仅复制对这些成员的对象引用,因此原始对象和克隆对象中的成员引用都引用同一个对象。

如果我们尝试在未实现 Cloneable  接口的类的对象上调用 CloneNotSupportedException ,我们将得到一个 CloneNotSupportedException 。此接口是一个标记接口,此接口的实现仅表示可以在实现类的对象上调用Object.clone()方法。

语法

protected Object clone() 抛出 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("Tutorialspoint!");
      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;
   }
}

输出

Welcome to Tutorialspoint!
Welcome to Tutorialspoint!

深层复制

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

示例

public class DeepCopyTest {
   public static void main(String args[]) {
      A a1 = new A();
      A a2 = (A) a1.clone();
      a1.sb.append(" TutorialsPoint!");
      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;
   }
}

输出

Welcome to TutorialsPoint!
Welcome to

相关文章