Posted on 2007-03-27 19:37
chenweicai 閱讀(455)
評論(1) 編輯 收藏
假設在你的應用中使用一些對象,你如何拷貝你的對象呢?最明顯的方法是講一個對象簡單的賦值給另一個,就像這樣:
??? obj2 = obj1;
??? 但是這個方法實際上沒有拷貝對象而僅僅是拷貝了一個對象引用,換換言之,在你執行這個操作后仍然只有一個對象,但是多出了一個對該對象的引用。
??? 如果這個看似明顯的方法不能正常工作,那么如何實際的拷貝一個對象呢?為什么不試試Object.clone呢?這個方法對Object的所有子類都是可用的。例如:
package clone.clone1;
public class ClassA implements Cloneable{//要繼承Cloneable接口,否則會拋出異常
?private int x;
?public ClassA(int x) {
??super();
??// TODO Auto-generated constructor stub
??this.x = x;
?}
?//要覆蓋clone方法,因為Object.clone()是protect類型
??? //Object.clone完成的是對象的“淺”拷貝,即簡單的成員到成員的拷貝。
?//它不做“深度”拷貝,即成員或者數組指向的對象的遞歸拷貝
?public Object clone(){
??// TODO Auto-generated method stub
??try{
???return super.clone();
??}catch(CloneNotSupportedException e){
???throw new InternalError(e.toString());
??}
?}
?public int getX() {
??return x;
?}
?public void setX(int x) {
??this.x = x;
?}
?
?
}
package clone.clone1;
public class Test {
?/**
? * @param args
? */
?public static void main(String[] args) {
??// TODO Auto-generated method stub
???ClassA a = new ClassA(12);
???ClassA b = (ClassA)a.clone();
???ClassA c = a;//此處多出了一個對該對象的引用,并沒有實現克隆原對象
???System.out.println("Object A's X is :" + a.getX());
???System.out.println("Object B's X is :" + b.getX());
???System.out.println("Object C's X is :" + c.getX());
???a.setX(16);
???b.setX(18);
???System.out.println("After set,Object A's X is :" + a.getX());
???System.out.println("After set,Object B's X is :" + b.getX());
???System.out.println("After set,Object C's X is :" + c.getX());
?}
}
Object.clone完成的是對象的“淺”拷貝,即簡單的成員到成員的拷貝。它不做“深度”拷貝,即成員或者數組指向的對象的遞歸拷貝。
package clone.clone2;
import java.util.HashMap;
public class ClassA implements Cloneable{
?
?public HashMap hashmap;//成員對象不是簡單的數據,而是復雜的數據類型
?public ClassA() {
??hashmap = new HashMap();
??hashmap.put("key1", "value1");
??hashmap.put("key2", "value2");
?}
?
?public Object clone(){//不能簡單的調用super.clone方法,
??//否則在新的對象中的復雜數據成員只是原對象的一個引用
??try{
???ClassA obj = (ClassA)super.clone();
???obj.hashmap = (HashMap)hashmap.clone();
???return obj;
??}catch(CloneNotSupportedException e){
??throw new InternalError(e.toString());
??}
?}
}
package clone.clone2;
public class test {
?public static void main(String[] args) {
??// TODO Auto-generated method stub
??ClassA a = new ClassA();
??ClassA b = (ClassA)a.clone();
??a.hashmap.remove("key1");
??System.out.println(b.hashmap.get("key1"));
??System.out.println(a.hashmap.get("key1"));
?}
}