Posted on 2007-03-27 19:37
chenweicai 阅读(452)
评论(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"));
}
}