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