📜  Java对象clone()

📅  最后修改于: 2020-09-27 02:25:11             🧑  作者: Mango

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访问字段名称版本 。但是,如果我们使用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()方法。