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

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

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

    http://tomsui.blog.hexun.com/4308236_d.html
    方法(一) 引用拷貝

    Employee original = new Employee ("tomsui",4000);

    Employee copy = original ;

    original 與copy僅僅是同一對(duì)象的不同引用。

    ?

    方法(二) 淺克隆

    直接利用Object的clone()方法:

    protected Objectclone()?? throws CloneNotSupportedException

    Employee copy = (Employee)original.clone();

    注意兩點(diǎn):

    1) Object的clone() 是protected. 只能在包內(nèi)或子類(lèi)調(diào)用.

    2) 如果淺克隆的對(duì)象中存在對(duì)象形式的成員變量:

    public class Employee

    {

    ??????? String name;

    ??????? int salary;

    ??????? Date birthday;

    }

    那么:

    ? Employee copy = (Employee) original.clone();

    只是拷貝了original對(duì)象中的基本類(lèi)型和不變量.可變的對(duì)象成員變量拷貝得到的仍然是引用.

    不變量應(yīng)該包括(可以參見(jiàn)<java多線程設(shè)計(jì)模式>Immutable模式中界定的情況):

    a. String類(lèi)對(duì)象

    b. 被final定義,子對(duì)象在生存周期中僅保存一些常量

    ?

    方法(三) 深克隆

    例子:

    class Employee implements Cloneable

    {

    ??????? private String name;

    ??????? private double salary;

    ??????? private Date birthday;

    ??????? // setter 與 getter

    ??????? public Object clone()

    ??????? {

    ??????????????? try

    ??????????????? {

    ??????????????????????? Employee cloned = (Employee ) super.clone();

    ??????????????????????? cloned.birthday = (Date) birthday.clone();

    ??????????????? }catch(CloneNotSupportedException e) {

    ??????????????? return null;

    ??????????????? }

    ??????? }

    }

    ?說(shuō)明:

    1)Employee 必須實(shí)現(xiàn) Cloneable接口 (標(biāo)志接口)

    ?????標(biāo)志接口:完全的空接口。這里的作用是告訴JVM,類(lèi)的設(shè)計(jì)者理解了cloneable()方法,可以通過(guò)isInstanceOf進(jìn)行運(yùn)行時(shí)檢查。

    2)覆寫(xiě)的clone()方法必須定義為public (原是protected)

    3)clone()方法體必須在try-catch {}中,捕獲處理CloneNotSupportedException 。(防止類(lèi)沒(méi)有實(shí)現(xiàn)Cloneable接口,正確實(shí)現(xiàn)了深克隆的話,這個(gè)異常肯定不會(huì)拋出)

    ps.?? JDK中,StringBuffer沒(méi)有覆寫(xiě)clone()方法,雖然它確實(shí)繼承了Object的clone(),但在實(shí)際應(yīng)用中, 因?yàn)镾tringBuffer絕不會(huì)有子類(lèi),而且是在JDK外使用StringBuffer,所以被protected界定的clone()方法是完全不可見(jiàn)的!

    ?

    方法(四)使用序列化進(jìn)行克隆

    這種方法涉及IO操作,所以相對(duì)來(lái)講要比方法(三)慢.

    import java.io.*;
    import java.util.*;

    public class SerialCloneTest
    {?
    ?? public static void main(String[] args)
    ?? {?
    ????? Employee harry = new Employee("Harry Hacker", 35000,
    ???????? 1989, 10, 1);
    ????? // clone harry
    ????? Employee harry2 = (Employee)harry.clone();

    ????? // mutate harry
    ????? harry.raiseSalary(10);

    ????? // now harry and the clone are different
    ????? System.out.println(harry);
    ????? System.out.println(harry2);
    ?? }
    }

    /**
    ?? A class whose clone method uses serialization.
    */
    class SerialCloneable implements Cloneable, Serializable
    {?
    ?? public Object clone()
    ?? {?
    ????? try
    ????? {?
    ???????? // save the object to a byte array
    ???????? ByteArrayOutputStream bout = new
    ??????????? ByteArrayOutputStream();
    ???????? ObjectOutputStream out
    ??????????? = new ObjectOutputStream(bout);
    ???????? out.writeObject(this);
    ???????? out.close();

    ???????? // read a clone of the object from the byte array
    ???????? ByteArrayInputStream bin = new
    ??????????? ByteArrayInputStream(bout.toByteArray());
    ???????? ObjectInputStream in = new ObjectInputStream(bin);
    ???????? Object ret = in.readObject();
    ???????? in.close();

    ???????? return ret;
    ????? }?
    ????? catch (Exception e)
    ????? {?
    ???????? return null;
    ????? }
    ?? }
    }

    /**
    ?? The familiar Employee class, redefined to extend the
    ?? SerialCloneable class.
    */
    class Employee extends SerialCloneable
    {?
    ?? public Employee(String n, double s,
    ????? int year, int month, int day)
    ?? {?
    ????? name = n;
    ????? salary = s;
    ????? GregorianCalendar calendar
    ???????? = new GregorianCalendar(year, month - 1, day);
    ???????? // GregorianCalendar uses 0 for January
    ????? hireDay = calendar.getTime();
    ?? }

    ?? public String getName()
    ?? {?
    ????? return name;
    ?? }

    ?? public double getSalary()
    ?? {?
    ????? return salary;
    ?? }

    ?? public Date getHireDay()
    ?? {?
    ????? return hireDay;
    ?? }

    ?? public void raiseSalary(double byPercent)
    ?? {?
    ????? double raise = salary * byPercent / 100;
    ????? salary += raise;
    ?? }

    ?? public String toString()
    ?? {?
    ????? return getClass().getName()
    ???????? + "[name=" + name
    ???????? + ",salary=" + salary
    ???????? + ",hireDay=" + hireDay
    ???????? + "]";
    ?? }

    ?? private String name;
    ?? private double salary;
    ?? private Date hireDay;
    }

    ?

    ?方法(五) 其他方法

    可以通過(guò)java的反射機(jī)制定義一個(gè)類(lèi)似于對(duì)象序列化的萬(wàn)能克隆。改進(jìn)后再貼上來(lái)。

    posted on 2006-08-29 15:04 pear 閱讀(1039) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 技術(shù)
     
    主站蜘蛛池模板: 一本色道久久综合亚洲精品高清| 免费观看的毛片大全| 国产国产人免费人成免费视频| 亚洲成a人片在线观| 最近中文字幕免费完整| 中文字幕亚洲免费无线观看日本| 久久永久免费人妻精品下载 | 美女扒开屁股让男人桶爽免费| 成年轻人网站色免费看| 亚洲欧美第一成人网站7777| 天天天欲色欲色WWW免费| 亚洲成av人片在www鸭子| 日本免费一区二区三区最新vr| 午夜亚洲国产理论片二级港台二级| 色视频色露露永久免费观看| 国产精品亚洲综合网站| 亚洲成A∨人片天堂网无码| 亚洲精品黄色视频在线观看免费资源| 国产亚洲情侣一区二区无码AV | 99久9在线|免费| 亚洲伊人色一综合网| 在线观看免费宅男视频| 男女猛烈xx00免费视频试看| 亚洲日韩中文在线精品第一| 国产色爽免费无码视频| 亚洲白色白色永久观看| 永久黄网站色视频免费观看| 人禽伦免费交视频播放| 好看的亚洲黄色经典| 国产高清不卡免费在线| 亚洲sm另类一区二区三区| 免费大黄网站在线观| 免费国产99久久久香蕉| 在线综合亚洲中文精品| 亚洲精品久久久www| 一级毛片**不卡免费播| 亚洲乱码av中文一区二区| 亚洲综合另类小说色区| 美女视频黄是免费的网址| 色吊丝免费观看网站| 亚洲黄色在线观看网站|