为什么会有深复制和浅复制这两个概念呢?首先,我们想一下,对于基本数据类型,jvm采用的值传递;对于引用类型,JVM采用的是地址传递。我们设想 有这么一段程序:
Obj a=new Obj();
Obj b=a;
显然,在这里,引用变量a和b,都指向了同一个对象,任意改变a或者b,都将会使对方发生相同的改变。那么如果我们只想改变a而不想改变b,怎么办呢?这里就需要我们的浅复制和深复制。
如果Obj类里面只有基本数据类型的话,我们只需要进行浅复制,若有引用类型的话,亦需进行深复制。
浅复制和深复制的主要区别就在于,被复制对象的 引用类型对象和复制对象的引用类型对象仍然是同一个对象;而深复制实现了不仅基本类型,而且引用类型都不再是原来的变量或者对象。
那么如何进行浅复制和深复制?
1.实现clone()的类首先要实现cloneable接口
2.重写clone()方法
3.在clone()中调用super.clone()方法
4.把浅复制的引用只想原型对象新的克隆体。
5.完成浅复制后,对对象或者能够引用类型的属性也调用clone()方法完成深复制。
demo如下:
import java.util.Date;
//java 中clone方法,深复制与浅复制
public class clone {
public static void main(String args[]) {
Obj a=new Obj();
Obj b=(Obj)a.clone();
System.out.println(a.getName());
a.setName("tom");
System.out.println(b.getName());
int i=1;
int j=i;
i=i+11;
System.out.println(j);
}
}
class Obj implements Cloneable{//实现cloneable
private int age;
private String name;
private Date birth=new Date();
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Object clone() {//重写clone()
Obj o=null;
try {
o=(Obj)super.clone();//先对基本类型进行浅复制: 调用父类的super(),注意强制转换,
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
o.birth=(Date)this.getBirth().clone();//然后对非基本类型实现深复制,对每一个对象调用clone()方法
return o;
}
}