设计模式中有一个原型模式,使用的接口Cloneable ,给出个简单例子说明深拷贝和浅拷贝的区别。
1. 浅拷贝
public class Thing implements Cloneable {
//定义一个私有变量
private ArrayList<String> arrayList = new ArrayList<>();
@Override
public Thing clone(){
Thing thing=null;
try {
thing = (Thing)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return thing;
}
//设置HashMap的值
public void setValue(String value){
this.arrayList.add(value);
}
//取得arrayList的值
public ArrayList<String> getValue(){
return this.arrayList;
}
}
public class Client2 {
public static void main(String[] args) {
//产生一个对象
Thing thing = new Thing();
//设置一个值
thing.setValue("张三");
//拷贝一个对象
Thing cloneThing = thing.clone();
cloneThing.setValue("李四");
System.out.println(thing.getValue());
}
}
结果如下:
[张三, 李四]
分析:
Object类提供的方法clone知识拷贝对象本身,对对象内部的数组、引用对象等都不拷贝,它还是指向的是原生对象的内部元素地址,这种拷贝就是浅拷贝,另外,其他的原始类型如int、long、char、String等是会被拷贝的(String很特殊,看做一个基本类型)。
2. 深拷贝
public class Thing1 implements Cloneable {
// 定义一个私有变量
private ArrayList<String> arrayList = new ArrayList<String>();
@Override
public Thing1 clone() {
Thing1 thing1 = null;
try {
thing1 = (Thing1) super.clone();
thing1.arrayList = (ArrayList<String>) this.arrayList.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return thing1;
}
//设置HashMap的值
public void setValue(String value){
this.arrayList.add(value);
}
//取得arrayList的值
public ArrayList<String> getValue(){
return this.arrayList;
}
}
public class Client3 {
public static void main(String[] args) {
//产生一个对象
Thing1 thing1 = new Thing1();
//设置一个值
thing1.setValue("张三");
//拷贝一个对象
Thing1 cloneThing = thing1.clone();
cloneThing.setValue("李四");
System.out.println(thing1.getValue());
}
}
结果如下:
[张三]
分析:
我们对私有的类变量进行独立的拷贝,就实现了完全的拷贝,两个对象之间没有任何的关系了,这就是深拷贝。
参考文献:《设计模式之禅》

946

被折叠的 条评论
为什么被折叠?



