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