import java.util.ArrayList;
import java.util.List;
import action.LoginAction;
/**
* Object.clone()方法为影子(浅)克隆,例如将对象A克隆出个B,
* 那么先根据A的大小分配B的空间,创建B对象,然后遍历A的域对象进行克隆。
* 克隆域对象时,如果是基本类型则重新创建对象然后赋值,包括String类型
* 对于非基本类型,则是复制引用,引用指向原域对象,修改其中一个另外一个就会改变
*
* 至于深度克隆,这是将 原来对象的属性和引用属性全部复制一份
* @author xubo
*
*/
public class CloneTest implements Cloneable {
public List<String> a = new ArrayList<String>();
public String b = new String("sss");
public LoginAction c = new LoginAction();
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
public List<String> getA() {
return a;
}
public void setA(List<String> a) {
this.a = a;
}
public LoginAction getC() {
return c;
}
public void setC(LoginAction c) {
this.c = c;
}
public CloneTest clone() throws CloneNotSupportedException {
return (CloneTest) super.clone();
}
public static void main(String args[]) throws CloneNotSupportedException {
CloneTest p = new CloneTest();
CloneTest p1 = p.clone();
CloneTest p2 = new CloneTest();
System.out.println(p == p1);
System.out.println(p.getA() == p1.getA());
System.out.println(p.getB() == p1.getB());
System.out.println(p.getC() == p1.getC());
System.out.println("===============================");
p1.setB("xx");
p.getC().setCos("cosA");
p1.getC().setCos("cosB");
System.out.println(p.getB() == p1.getB());
System.out.println(p.getB() + ";;;;;;;;;;;;;" + p.getC().getCos());
System.out.println(p1.getB() + ";;;;;;;;;;;;;" + p1.getC().getCos());
System.out.println("===============================");
System.out.println(p.getB());
System.out.println(p.getB() == p2.getB());
System.out.println(p.getC() == p2.getC());
}
}
运行结果
false
true
true
true
===============================
false
sss;;;;;;;;;;;;;cosB
xx;;;;;;;;;;;;;cosB
===============================
sss
false
false