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
的类。该类包括两个字段 name
和 version
。在这里,我们使用类的对象 obj1
初始化了类字段。
注意这一行,
Main obj2 = (Main)obj1.clone();
这里,我们使用了 clone()
方法来创建 obj1
的副本。clone()
返回的值被赋给了对象 obj2
。由于 clone()
的返回值是 Object
类型,我们使用 (Main)
将其转换为 Main
类型。
现在,字段 name
和 version
可以通过对象 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
更改了变量的值。现在当我们为 obj1
和 obj2
打印变量名时,可以看到 obj1
的值没有改变。这是因为 clone()
方法制作了对象的浅拷贝。
要了解更多关于浅拷贝的信息,请访问 Java 中什么是浅拷贝?
我们将 clone()
方法放在了 Java try...catch 块内。这是因为如果无法克隆对象,
子类可能会抛出异常。
注意:Object
类是 Java 中所有类的超类。因此,每个类和数组都可以实现 clone()
方法。