为什么要使用克隆?
编程过程中,经常会遇到从一个已有的对象A,创造出一个相同的对象B,并且对对象B的改变和修改不会影响到A。仅仅通过简单的赋值操作达不到这个目的,而java提供了Object类的clone()方法满足这个需求。
深拷贝和浅拷贝的举例?
1、浅复制
(1)实现clone的类首先要实现cloneable接口,,实质上是一个标识接口,没有任何接口方法;
(2)在类中重写Object类的clone()方法;
(3)在clone()方法中调用super.clone()方法。
(4)把浅复制的引用指向原型对象新的克隆体。
public class clone {
public static void main(String[] args) {
Student s1=new Student();
Student s2=(Student)s1.clone();
s2.change();
System.out.println("s1:"+s1.getA());
System.out.println("s2:"+s2.getA());
}
}
class Student implements Cloneable {
private int a = 0;
public void change() {
this.a = 1;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public Object clone() {
Object o = null;
try {
o = (Object) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
}
2、深复制
当类中只有基本数据类型的时候,采用浅复制就可以了。但是如果有其他数据类型,就需要进行深复制。
实现方法是:在对对象调用clone()方法完成之后,接着对对象之中非基本数据类型的属性也调用clone方法完成深复制。
public class clone {
public static void main(String[] args) {
Student s1=new Student();
Student s2=(Student)s1.clone();
s2.changeDate();
System.out.println("s1:"+s1.getDate());
System.out.println("s2:"+s2.getDate());
}
}
class Student implements Cloneable {
private int a = 0;
private Date date=new Date();
public void change() {
this.a = 1;
}
public void changeDate(){
this.date.setTime(167878098);
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public Object clone() {
Student o = null;
try {
o = (Student) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
o.date=(Date)this.getDate().clone();
return o;
}
}
深复制与浅复制如何选择?
(1)检查类中是否有非基本数据类型,如果没有,直接浅复制,返回super.clone即可。
(2)确保类中所有的非基本数据类型的属性都实现了深复制。
深复制和浅复制的区别?
我理解的就是,在clone的时候,
浅复制就是对于基本数据类型实现真正的克隆,非基本数据类型的复制还是指向原来对象的内存地址。
而深复制,是对基本数据类型进行了真正的克隆,并且对非基本数据类型也进行了真正的克隆,建立了新的对象引用。