在这里,浅表复制意味着它将创建一个新对象并复制与该对象关联的所有字段和方法。
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访问字段名称和版本 。但是,如果我们使用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()
方法。