📜  Java中的 CloneNotSupportedException 示例(1)

📅  最后修改于: 2023-12-03 15:31:51.408000             🧑  作者: Mango

Java中的 CloneNotSupportedException 示例

在 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() 方法。