posts - 51, comments - 17, trackbacks - 0, articles - 9
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

java clone

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

}


评论

# re: java clone  回复  更多评论   

2012-05-12 18:08 by fmj
感谢博主。。

只有注册用户登录后才能发表评论。


网站导航: