posts - 51, comments - 17, trackbacks - 0, articles - 9
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          java clone

          Posted on 2007-03-27 19:37 chenweicai 閱讀(456) 評論(1)  編輯  收藏
          假設(shè)在你的應(yīng)用中使用一些對象,你如何拷貝你的對象呢?最明顯的方法是講一個(gè)對象簡單的賦值給另一個(gè),就像這樣:

          ??? obj2 = obj1;
          ??? 但是這個(gè)方法實(shí)際上沒有拷貝對象而僅僅是拷貝了一個(gè)對象引用,換換言之,在你執(zhí)行這個(gè)操作后仍然只有一個(gè)對象,但是多出了一個(gè)對該對象的引用。

          ??? 如果這個(gè)看似明顯的方法不能正常工作,那么如何實(shí)際的拷貝一個(gè)對象呢?為什么不試試Object.clone呢?這個(gè)方法對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方法,因?yàn)镺bject.clone()是protect類型
          ??? //Object.clone完成的是對象的“淺”拷貝,即簡單的成員到成員的拷貝。
          ?//它不做“深度”拷貝,即成員或者數(shù)組指向的對象的遞歸拷貝
          ?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;//此處多出了一個(gè)對該對象的引用,并沒有實(shí)現(xiàn)克隆原對象
          ???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完成的是對象的“淺”拷貝,即簡單的成員到成員的拷貝。它不做“深度”拷貝,即成員或者數(shù)組指向的對象的遞歸拷貝。
          package clone.clone2;

          import java.util.HashMap;

          public class ClassA implements Cloneable{
          ?
          ?public HashMap hashmap;//成員對象不是簡單的數(shù)據(jù),而是復(fù)雜的數(shù)據(jù)類型

          ?public ClassA() {
          ??hashmap = new HashMap();
          ??hashmap.put("key1", "value1");
          ??hashmap.put("key2", "value2");
          ?}
          ?
          ?public Object clone(){//不能簡單的調(diào)用super.clone方法,
          ??//否則在新的對象中的復(fù)雜數(shù)據(jù)成員只是原對象的一個(gè)引用
          ??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  回復(fù)  更多評論   

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

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 武安市| 梁山县| 涟源市| 双辽市| 静乐县| 体育| 彭水| 孟连| 南溪县| 那坡县| 永康市| 文化| 麦盖提县| 理塘县| 阿城市| 宣威市| 宁陵县| 山阳县| 鹰潭市| 桑日县| 玛纳斯县| 辉县市| 邻水| 夏河县| 玛曲县| 宣武区| 秦皇岛市| 西平县| 漳平市| 惠安县| 石台县| 昌邑市| 安徽省| 平度市| 镇江市| 平陆县| 澜沧| 江永县| 榆树市| 合作市| 石首市|