深clone和浅clone

public class CloneClient {
/**
* 浅拷贝定义:Object类提供的方法clone只是拷贝本对象,其对象内部数组、引用对象等都不拷贝,
* 还是指向原生对象的内部元素地址。
* @param args
*/
public static void main(String[] args) {
//浅拷贝
Thing thing = new Thing();
thing.setValue("zhang san");
Thing cloneThing = thing.clone();
cloneThing.setValue("li si");
System.out.println(thing.getValue());

//深拷贝
Thing2 thing2 = new Thing2();
thing2.setValue("zhang san");
Thing2 cloneThing2 = thing2.clone();
cloneThing2.setValue("li si");
System.out.println(thing2.getValue());

}
}

public class Thing implements Cloneable{

private ArrayList<String> list = new ArrayList<String>();

@Override
protected Thing clone(){
Thing thing = null;
try {
thing = (Thing) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return thing;
}

public void setValue(String value){
list.add(value);
}

public ArrayList<String> getValue(){
return list;
}
}

public class Thing2 implements Cloneable{

private ArrayList<String> list = new ArrayList<String>();

@SuppressWarnings("unchecked")
@Override
protected Thing2 clone(){
Thing2 thing = null;
try {
thing = (Thing2) super.clone();
thing.list = (ArrayList<String>) this.list.clone();//深拷贝
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return thing;
}

public void setValue(String value){
list.add(value);
}

public ArrayList<String> getValue(){
return list;
}
}

运行结果:
[zhang san, li si]
[zhang san]

猜你喜欢

转载自wudukongjian007-163-com.iteye.com/blog/1654628
今日推荐