📅  最后修改于: 2023-12-03 15:31:51.408000             🧑  作者: Mango
在 Java 中,对象复制机制是通过对象的 clone()
方法来实现的。但是,并不是所有的对象都能被成功地复制。如果一个对象的类没有实现 Cloneable
接口,或者实现了 Cloneable
接口但没有重写 clone()
方法,则在调用该对象的 clone()
方法时会抛出 CloneNotSupportedException
异常。
下面是一个示例,演示了在没有实现 Cloneable
接口的情况下调用 clone()
方法的结果:
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class CloneExample {
public static void main(String[] args) {
Person person = new Person("John", 30);
try {
Person clonePerson = (Person)person.clone();
System.out.println(clonePerson.getName()); // 不会执行到这里
} catch (CloneNotSupportedException e) {
System.out.println("Clone not supported");
}
}
}
在上面的示例中,Person
类没有实现 Cloneable
接口,因此调用 person.clone()
方法时会抛出 CloneNotSupportedException
异常。运行该示例会输出字符串 "Clone not supported"
。
如果我们想让 Person
类支持复制,就需要让它实现 Cloneable
接口,并重写 clone()
方法:
class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class CloneExample {
public static void main(String[] args) {
Person person = new Person("John", 30);
try {
Person clonePerson = (Person)person.clone();
System.out.println(clonePerson.getName()); // 输出 "John"
} catch (CloneNotSupportedException e) {
System.out.println("Clone not supported");
}
}
}
在上面的示例中,Person
类实现了 Cloneable
接口,并重写了 clone()
方法。在 clone()
方法中,我们调用了 super.clone()
方法,该方法会返回对象的克隆副本。接着在 main()
方法中,我们成功地复制了 Person
类的实例,并输出了克隆后的对象的名称。
总之, CloneNotSupportedException
异常是在没有实现 Cloneable
接口或者实现了 Cloneable
接口但没有重写 clone()
方法的情况下调用 clone()
方法时抛出的异常。要实现可复制的类,需要让类实现 Cloneable
接口,并重写 clone()
方法。