当函数的参数是对象时,传递的是引用类型,在对象函数内部的操作会影响到外边对象。 如果希望传递的是对象的一个拷贝时,这时就需要用到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(); } }