在项目中看到前人写的代码用到了 spring 框架的 BeanUtils.copyProperties 方法,想了解一下这个方法是深拷贝仍是浅拷贝,其实这个方法内部对于基本数据类型实现了深拷贝,但对于引用类型仍是浅拷贝的。spring
在 Java 中,除了基本数据类型(元类型)以外,还存在类的实例对象这个引用数据类型。而通常使用 『 = 』号作赋值操做的时候。对于基本数据类型,其实是拷贝的它的值,可是对于对象而言,其实赋值的只是这个对象的引用,将原对象的引用传递过去,他们实际上仍是指向的同一个对象。segmentfault
而浅拷贝和深拷贝就是在这个基础之上作的区分,若是在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行了引用的传递,而没有真实的建立一个新的对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,建立了一个新的对象,而且复制其内的成员变量,则认为是深拷贝。框架
所以,所谓的浅拷贝和深拷贝,只是在拷贝对象的时候,对 类的实例对象 这种引用数据类型的不一样操做而已。spa
总结来讲:对象
浅拷贝和深拷贝实际上是相对的:get
那么,如何进行一个深拷贝呢?io
比较经常使用的方案有两种:基础