当类中只有基本数据类型的时候,可以进行浅复制,需要复制的类首先要继承Clonebale接口(只是一个标识接口),然后重写clone()方法
public class Clone implements Cloneable{
private int a = 0;
public int getInt(){
return a;
}
public int changeInt(){
a = 1;
return a;
}
public Object clone(){//覆盖clone方法
Object o = null;
try {
o = super.clone();//无论clone类的继承结构是什么,super.clone()都会直接或间接调用java.lang.Object类的clone方法
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
}
public class Main {
public static void main(String[] args) throws IOException {
Clone c = new Clone();
Clone cl = (Clone)c.clone();
cl.changeInt();
System.out.println("c的int值为"+c.getInt());
System.out.println("cl的int值为"+cl.getInt());
}
}
当类中包含一些对象的时候,就要用到深复制了,实现方法时在对对象调用clone方法完成复制后,接着对对象中的非基本类型的属性也调用clone方法完成深复制。
public class Clone implements Cloneable{
private Date date = new Date();
public Date getDate(){
return date;
}
public void setDate(Date date){
this.date = date;
}
public void changeDate(){
this.date.setMonth(8);
}
public Object clone(){//覆盖clone方法
Clone o = null;
try {
o = (Clone) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//实现深复制
o.date = (Date) this.getDate().clone();
return o;
}
}
public class Main {
public static void main(String[] args) throws IOException {
Clone c = new Clone();
Clone cl = (Clone)c.clone();
cl.changeDate();
System.out.println("c的date为"+c.getDate());
System.out.println("cl的date为"+cl.getDate());
}
}
实现深复制要注意确保类中包含的所有非基本数据类型的成员变量都实现了深复制。
深复制与浅复制的相同之处在于被复制对象的所有变量与原来对象的值都相同
不同之处在于引用的其他对象的变量。浅复制不复制引用的对象,而深复制会使引用其他对象的变量指向被复制的新对象。例如
Class Test{
public String s = "aaaa";
}
浅复制后原Test对象和Test对象副本指向的字符串对象“aaaa”是同一个;而深复制会复制出一个相同的“aaaa”,这样原Test对象和Test对象的副本就会指向不同“aaaa”
浅复制如下:
深复制如下: