跳到主要内容

Java Object clone() 方法

这里,浅拷贝指的是创建一个新对象并复制与该对象相关联的所有字段和方法。

clone() 方法的语法是:

object.clone()

clone() 参数

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

clone() 返回值

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

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

示例 1:Java clone()

class Main implements Cloneable {

// 声明变量
String name;
int version;
public static void main(String[] args) {

// 创建 Main 类的对象
Main obj1 = new Main();

// 使用 obj1 初始化 name 和 version
obj1.name = "Java";
obj1.version = 14;

// 打印变量
System.out.println(obj1.name); // Java
System.out.println(obj1.version); // 14

try {

// 创建 obj1 的克隆
Main obj2 = (Main)obj1.clone();

// 使用 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 类型。

现在,字段 nameversion 可以通过对象 obj2 来访问。然而,如果我们使用 obj2 改变这些字段的值,与 obj1 相关联的值不会改变。

示例 2:使用克隆对象更改值

class Main implements Cloneable {

// 声明变量
String name;
int version;
public static void main(String[] args) {

// 创建 Main 类的对象
Main obj1 = new Main();

// 使用 obj1 初始化 name 和 version
obj1.name = "Java";
obj1.version = 14;

// 打印变量
System.out.println(obj1.name); // Java
System.out.println(obj1.version); // 14

try {

// 创建 obj1 的克隆
Main obj2 = (Main)obj1.clone();

// 使用 obj2 打印变量
System.out.println(obj2.name); // Java
System.out.println(obj2.version); // 14

// 更改 name 的值
// 使用 obj2
obj2.name = "Python";
System.out.println(obj2.name); // Python

// 检查是否改变了
// 与 obj1 相关联的值
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() 方法。