深克隆和浅克隆

深克隆(Deep Clone)和浅克隆(Shadow Clone)的主要区别在于它们复制对象的方式和范围。

浅克隆是把原型对象中成员变量为值类型的属性都复制给克隆对象,把原型对象中成员变量为引用类型的引用地址也复制给克隆对象。简单来说,浅克隆只会复制原型对象和原型对象的地址,但不会复制它所引用的对象。

深克隆则是将原型对象中的所有类型,无论是值类型还是引用类型,都复制一份给克隆对象。也就是说,深克隆会把原型对象和原型对象所引用的对象,都复制一份给克隆对象。

深克隆和浅克隆的主要区别体现在对对象的复制方式上。

浅克隆是在克隆对象时,对于基本数据类型的变量会重新复制一份,而对于引用类型的变量只是对引用进行复制。也就是说,浅复制只会将对象的各个属性进行依次复制,并不会进行递归复制。因此,浅克隆出来的数据并不能完全脱离原数据,克隆前与克隆后的变量各自的变化会相互影响。

深克隆则不同,它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制到新对象上。也就是说,深克隆本质上是创造一个完全一样的对象,但是两个对象的引用地址完全不同。因此,深克隆出来的数据与原数据完全脱离,所有对于新对象的修改都不会反映到原对象中

在对一个实体类进行克隆时,基本类型会被直接复制,而对于引用类型只会复制其地址,复制出来的对象的引用类型的地址和克隆前相同,改变克隆对象的引用类型属性的值时,原类型也会跟着改变,所以在对引用类型克隆时,需要在重写的clone方法中,对引用类型进行深克隆

@Override
    public Person clone() {
        try {
            //浅克隆
            // 调用Object类的clone方法得到对象的浅克隆
//            Person clonedPerson = (Person) super.clone();

            //深克隆
            Person clonedPerson = (Person) super.clone();
            clonedPerson.score = this.score.clone();
            // 如果有引用类型的成员变量,需要进行深克隆
            // 在这个例子中,name是String类型,属于不可变对象,可以直接使用

            return clonedPerson;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

你可能感兴趣的:(java)