<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    java clone

    Posted on 2007-03-27 19:37 chenweicai 閱讀(457) 評論(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
    感謝博主。。

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品美女在线观看| 亚洲中文字幕久久精品无码VA| 无忧传媒视频免费观看入口| 日韩色日韩视频亚洲网站| 国产精品视频免费一区二区| 亚洲乱码中文论理电影| 四虎国产精品成人免费久久| 亚洲国产成人久久笫一页| 有色视频在线观看免费高清在线直播| 亚洲成av人片一区二区三区| 免费无遮挡无码视频在线观看 | 毛片a级毛片免费播放下载| 亚洲av无码一区二区三区观看| 全黄A免费一级毛片| 久久精品国产精品亚洲下载| 99久久婷婷国产综合亚洲| 久久这里只精品热免费99| 亚洲伦另类中文字幕| 亚洲成人免费网址| 亚洲区小说区图片区QVOD| 久久免费区一区二区三波多野| 久久亚洲中文字幕精品有坂深雪 | 久久国产乱子免费精品| 亚洲高清无在码在线无弹窗| 久久性生大片免费观看性| 亚洲AV日韩精品久久久久久| 皇色在线免费视频| 亚洲视频免费在线观看| 亚洲精品在线免费看| 亚洲av日韩专区在线观看| 国产亚洲精品成人a v小说| 免费无码VA一区二区三区| 亚洲日韩国产欧美一区二区三区| 免费人成在线观看播放国产| 精品一区二区三区免费视频| 亚洲美免无码中文字幕在线| 日韩成人在线免费视频| a级片免费在线观看| 亚洲精品国产国语| 亚洲精品无码精品mV在线观看| 国产在线jyzzjyzz免费麻豆|