Java Object clone()

这里,浅拷贝意味着它会创建一个新的对象并复制与该对象相关的所有字段和方法。

clone() 方法的语法是

object.clone()

clone() 参数

clone()方法不接受任何参数。


clone()返回值

  • 返回对象的副本
  • 如果对象的类没有实现Cloneable接口,则抛出CloneNotSupportedException

注意Object类没有实现Cloneable。因此,我们不能调用Object类对象的clone()方法。


示例1:Java clone()

class Main implements Cloneable {

  // declare variables
  String name;
  int version;
  public static void main(String[] args) {

    // create an object of Main class
    Main obj1 = new Main();

    // initialize name and version using obj1
    obj1.name = "Java";
    obj1.version = 14;

    // print variable
    System.out.println(obj1.name);       // Java
    System.out.println(obj1.version);    // 14

    try {

      // create clone of obj1
      Main obj2 = (Main)obj1.clone();

      // print the variables using obj2
      System.out.println(obj2.name);      // Java
      System.out.println(obj2.version);   // 14
    }
    catch (Exception e) {
      System.out.println(e);
    }

  }
}

在上面的示例中,我们创建了一个名为Main的类。该类包含两个字段nameversion。这里,我们使用该类的对象obj1初始化了类字段。

注意这行:

Main obj2 = (Main)obj1.clone();

这里,我们使用clone()方法创建了obj1的副本。clone()返回的值被赋给了对象obj2。由于clone()的返回值是Object类型,我们使用了(Main)将其转换为Main类型。

现在可以使用对象obj2访问字段nameversion。但是,如果我们使用obj2更改字段的值,obj1关联的值将不会改变。

示例2:通过克隆对象更改值

class Main implements Cloneable {

  // declare variables
  String name;
  int version;
  public static void main(String[] args) {

    // create an object of Main class
    Main obj1 = new Main();

    // initialize name and version using obj1
    obj1.name = "Java";
    obj1.version = 14;

    // print variable
    System.out.println(obj1.name);        // Java
    System.out.println(obj1.version);     // 14

    try {

      // create a clone of obj1
      Main obj2 = (Main)obj1.clone();

      // print the variables using obj2
      System.out.println(obj2.name);      // Java
      System.out.println(obj2.version);   // 14

      // changing value of name
      // using obj2
      obj2.name = "Python";
      System.out.println(obj2.name);      // Python

      // check if value associated 
      // with obj1 is changed
      System.out.println(obj1.name);      // Java
    }
    catch (Exception e) {
      System.out.println(e);
    }

  }
}

注意这行:

obj2.name = "Python";

在这里,我们通过obj2更改了变量的值。现在,当我们打印obj1obj2的变量名时,我们可以看到obj1的值没有改变。这是因为clone()方法会创建对象的浅拷贝。

要了解更多关于浅拷贝的信息,请访问Java中的浅拷贝是什么?

我们将clone()方法放在Java try...catch块中。这是因为子类可能会抛出异常,如果对象无法被克隆。

注意Object类是Java中所有类的超类。因此,每个类和数组都可以实现clone()方法。


另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战