所谓拷贝,就是复制出一个和已有对象一模一样的对象,而Java中有基础数据类型和引用类型两种。而其中基础数据类型是存放在栈里面的,而引用数据类型的存储方式是在栈中有个指向堆地址的句柄。所以,拷贝对于基础数据类型而言,就是将栈里面的值变成目标值,对于引用数据类型有两种方式,一种是将栈中存放的句柄值更改成目标对象在堆中的地址,另一种就是新开辟一份空间,并将目标对象的属性值复制过来。
上述两种复制数据类型的方式就是深拷贝和浅拷贝的区别,所谓的浅拷贝:
创建一个新对象,然后将当前对象的非静态字段复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象。
而深拷贝:
创建一个新对象,然后将当前对象的非静态字段复制到该新对象,无论该字段是值类型的还是引用类型,都复制独立的一份。当你修改其中一个对象的任何内容时,都不会影响另一个对象的内容。
总结:浅拷贝和深拷贝的最大不同是,浅拷贝出来的其实是同一个对象,在堆中的内存地址都一样,深拷贝是复制出一个属性值一样的不同的对象,在堆中的内存地址不一样。