java.lang.Object 之 clone() 深拷贝,浅拷贝

  当函数的参数是对象时,传递的是引用类型,在对象函数内部的操作会影响到外边对象。 如果希望传递的是对象的一个拷贝时,这时就需要用到object的clone()方法。拷贝对象返回的是一个新对象,而不是引用;拷贝对象与new操作符返回的新对象的区别就是这个拷贝对象已经包含了原来对象的一些信息,而不是对象的初始信息。 什么时候使用shallow Clone(浅拷贝,影子拷贝),什么时候使用 deep clone(深拷贝):主要看具体域对象的性质是什么,如果是基本类型使用shallow clone ,如果是 reference variable(引用变量)使用deep clone 。

  在clone中分为浅拷贝和深拷贝,浅拷贝就是不管参数是基本类型还是引用类型,直接调用super.clone()进行拷贝,结果引用类型还是指向相同的内存;深拷贝就是在调用super.clone()之后,还要调用引用参数的clone()函数,进行拷贝,来达到深拷贝。

  浅拷贝:

  (1) 基本的数据类型(String)是会拷贝复制一份新的对象

  (2)引用对象还是引用同一份对象

  

public class Shallow implements Cloneable {

    private Deep deep;

    @Override
    protected Shallow clone() throws CloneNotSupportedException {
        Shallow shallow = (Shallow) super.clone();
        //shallow.deep = deep.clone();浅复制
        return shallow;
    }
}

class Deep implements Cloneable {

    @Override
    protected Deep clone() throws CloneNotSupportedException {
        return (Deep) super.clone();
    }
}

 

  深拷贝:

  (1)对存在的引用类型也进行拷贝

 

public class Shallow implements Cloneable {

    private Deep deep;

    @Override
    protected Shallow clone() throws CloneNotSupportedException {
        Shallow shallow = (Shallow) super.clone();
        shallow.deep = deep.clone();//深复制
        return shallow;
    }
}

class Deep implements Cloneable {

    @Override
    protected Deep clone() throws CloneNotSupportedException {
        return (Deep) super.clone();
    }
}

 

转载于:https://www.cnblogs.com/cmdra/p/5902706.html

`BeanUtils.copyProperties`方法是浅拷贝,而不是深拷贝浅拷贝意味着它会将源对象的属性值复制到目标对象中,但如果属性值是引用类型对象,那么目标对象和源对象将引用同一个对象。这意味着如果修改一个对象的属性值,另一个对象的属性值也会被修改。 如果你需要进行深拷贝,即复制对象及其引用类型属性的所有层级,你可以考虑使用其他方法或工具来实现。一种常见的做法是通过序列化和反序列化来实现深拷贝,或者使用第三方库如Apache Commons Lang的`SerializationUtils.clone`方法。 以下是使用Apache Commons Lang库实现深拷贝的示例代码: ```java import org.apache.commons.lang3.SerializationUtils; public class DeepCopyExample { public static void main(String[] args) { SourceObject source = new SourceObject(); source.setName("John"); source.setAge(25); DestinationObject destination = SerializationUtils.clone(source); System.out.println("Source: " + source.getName() + ", " + source.getAge()); System.out.println("Destination: " + destination.getName() + ", " + destination.getAge()); // 修改源对象的属性值 source.setName("Alice"); source.setAge(30); System.out.println("Source: " + source.getName() + ", " + source.getAge()); System.out.println("Destination: " + destination.getName() + ", " + destination.getAge()); } } class SourceObject implements Serializable { private String name; private int age; // 省略 getter 和 setter 方法 } class DestinationObject implements Serializable { private String name; private int age; // 省略 getter 和 setter 方法 } ``` 这个示例中,通过使用`SerializationUtils.clone`方法对源对象进行深拷贝,确保了目标对象与源对象是独立的。修改源对象的属性值不会影响到目标对象。 希望这能解答你的问题!如果还有任何疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值