什么是对象克隆?
对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程。 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容。 这就是为什么在克隆后更改原始对象的内容时,所做的更改不会反映在克隆对象中的原因。
我们可以在Java中克隆任何对象吗?
不,我们不能。 当我们尝试直接克隆未实现名为'Cloneable'的标记接口的对象实例时,将导致一个名为CloneNotSupportedException的异常。 因此,为了允许克隆对象实例,相应的对象类必须实现Cloneable接口。 例如 -
public class Employee {
private String name;
public Employee(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static void main(String[] args) {
Employee emp = new Employee("Abhi");
try {
Employee emp2 = (Employee) emp.clone();
System.out.println(emp2.getName());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
上面的代码在执行时会引发异常,例如–
java.lang.CloneNotSupportedException: Employee
at java.base/java.lang.Object.clone(Native Method)
at Employee.main(Employee.java:16)
请注意,Cloneable是标记接口 ,这意味着它没有任何克隆方法规范。 在上面的代码片段中,实现Cloneable只是向JVM指示可以克隆Employee类实例,并且Object类的clone方法对于Employee类而言是合法的。
下面是如何正确克隆Employee类实例以及如何在Employee类中覆盖Object的clone方法的方法。
public class Employee implements Cloneable {
private String name;
public Employee(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Object clone()throws CloneNotSupportedException{
return (Employee)super.clone();
}
public static void main(String[] args) {
Employee emp = new Employee("Abhi");
try {
Employee emp2 = (Employee) emp.clone();
System.out.println(emp2.getName());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
其他标记接口是Serializable , Cloneable和Remote接口。
翻译自: https://www.javacodegeeks.com/2018/03/understanding-cloneable-interface-in-java.html