📜  Java中的可克隆接口(1)

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

Java中的可克隆接口

在Java中,我们可以使用Cloneable接口来实现对象的克隆。该接口是一个标记接口,表示它的实现类可以安全的进行浅层次的克隆,即只是复制对象本身,而不会复制它所引用的对象。

如何实现可克隆接口

只需在你的类中实现Cloneable接口,然后覆盖Object类中的Clone()方法即可。以下是一个简单的示例:

public class Person implements Cloneable {
    private String name;
    private int age;
    
    // 构造函数
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // 覆盖Object类中的clone方法
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

其中,Object类中的clone()方法实现的是一个浅克隆。

浅克隆与深克隆的区别

浅克隆只复制对象本身,而不复制它所引用的对象。因此,如果原对象中包含了对象引用,那么克隆后的对象中将会引用同样的对象。这就可能会导致一个对象被多个对象所引用,从而造成一些问题。

深克隆则会复制整个对象,包括它所引用的对象。一般情况下,如果我们的类中包含了其他类的对象引用,那么我们应该实现深克隆。以下是一个实现深克隆的示例:

public class Person implements Cloneable {
    private String name;
    private int age;
    private Address address; // 引用对象
    
    // 构造函数
    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }
    
    // 覆盖Object类中的clone方法
    @Override
    public Object clone() throws CloneNotSupportedException {
        // 先克隆对象本身
        Person person = (Person)super.clone();
        // 再克隆对象引用的对象
        person.address = (Address)address.clone();
        return person;
    }
}

public class Address implements Cloneable {
    private String city;
    private String street;
    
    // 构造函数
    public Address(String city, String street) {
        this.city = city;
        this.street = street;
    }
    
    // 覆盖Object类中的clone方法
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

以上就是Java中可克隆接口的介绍,它可以让我们快速、方便地实现对象克隆功能。当然,在实际开发中,我们需要根据具体情况来决定是使用浅克隆还是深克隆。