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

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

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

    AntSoul

    它總是在行走,行走,永遠的行走…… 行走是它生存的恒久姿態和最佳造型。 它似乎有一雙不知疲倦的腳。 ———我說的是螞蟻。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      42 隨筆 :: 0 文章 :: 1 評論 :: 0 Trackbacks

    ?? 有的時候我們為了獲取對象的一份copy,可以利用Object類的clone方法來實現,要想實現克隆,我們必須在派生類中實現Cloneable interface并覆蓋基類的clone()方法,并擴大訪問權限為public,在派生類的clone()方法,調用super.clone()。

    ?demo:
    class StringTest
    {
    ?public static void main(String[] args)
    ?{
    ??Professior p = new Professior("wangwu",50);
    ??Student s1 = new Student("zhangsan",18,p);
    ??Student s2 = (Student)s1.clone();
    ??s2.p.name = "lisi";
    ??s2.p.age = 20;
    ??
    ??System.out.println("s1.p.name="+s1.p.name+","+"s1.p.age="+s1.p.age);
    ?}
    }

    class Student implements Cloneable
    {
    ? Professior p;
    ? String name;
    ? int age;
    ?
    ?public Student(String name,int age,Professior p)
    ?{
    ??this.name =name;
    ??this.age = age;
    ??this.p = p;
    ?}
    ?
    ?public Object clone()
    ?{
    ??Object o = null;
    ??try
    ??{
    ???o=super.clone();
    ??}
    ??catch(CloneNotSupportedException e)
    ??{
    ???System.out.println(e.toString());
    ??}
    ??return o;
    ?}
    ?
    ?public String toString()
    ?{
    ??return "name="+name+","+"age="+age;
    ?}
    }

    class Professior
    {
    ?String name;
    ?int age;
    ?public Professior(String name,int age)
    ?{
    ??this.name = name;
    ??this.age = age;
    ?}
    }

    Result:
    D:\jcode>java StringTest
    s1.p.name=lisi,s1.p.age=20
    通過結果看得出一個問題,當我們修改s2的Professior后,s1對象的Professior對象的值被修改了。不是有clone了2份copy嗎?那怎么修改S1的值卻影響了S2的值了,那是因為我們克隆的時候只是把Professior的引用復制了一份,而并沒有實際在內存中給它分配到一塊內存,所以我們clone的時候,其實是把同一個值給復制了2次,所以s1和s2操作的professior都是同一個對象,所以修改S1,必然就影響了S2的professior的值,那我們的本意并非如此,有沒有辦法解決呢?答案是肯定的。其實我們剛才所做的操作是一個淺克隆,當我們克隆的對象是引用類型的時候,可以用深克隆來實現。就如下面的Demo.
    class CloneTest
    {
    ?public static void main(String[] args)
    ?{
    ??Boss boss = new Boss("antsoul",25);
    ??Leader leader = new Leader("linda",30);
    ??Employee ep1 = new Employee("zhangsan",107,leader,boss);
    ??? Employee ep2 = (Employee)ep1.clone();
    ??? ep2.boss.name = "gll";
    ??? ep2.boss.age = 60;
    ??? System.out.println("ep1.leader.name="+ep1.boss.name);
    ??? System.out.println("ep1.leader.age="+ep1.boss.age);
    ?}?
    }

    class Employee implements Cloneable
    {
    ?String name;
    ?int eid;
    ?Leader leader;
    ?Boss boss;
    ?
    ?Employee(String name,int eid,Leader leader,Boss boss)
    ?{
    ??this.name = name;
    ??this.eid = eid;
    ??this.leader = leader;
    ??this.boss = boss;
    ?}
    ?
    ?public Object clone()
    ?{
    ??Employee o = null;
    ??try
    ??{
    ???o = (Employee)super.clone();
    ??}
    ??catch(CloneNotSupportedException e)
    ??{
    ???System.out.println(e.toString());
    ??}
    ??o.leader = (Leader)leader.clone();
    ??o.boss = (Boss)boss.clone();
    ??return o;
    ?}
    }

    class Leader implements Cloneable
    {
    ?String name;
    ?int age;
    ?
    ?Leader(String name,int age)
    ?{
    ??this.name = name;
    ??this.age = age;
    ?}
    ?
    ?public Object clone()
    ?{
    ??Object o = null;
    ??try
    ??{
    ???o = super.clone();
    ??}
    ??catch(CloneNotSupportedException e)
    ??{
    ???System.out.println(e.toString());
    ??}
    ??return o;
    ?}
    }

    class Boss implements Cloneable
    {
    ?String name;
    ?int age;
    ?
    ?Boss(String name,int age)
    ?{
    ??this.name = name;
    ??this.age = age;
    ?}
    ?
    ?public Object clone()
    ?{
    ??Object o = null;
    ??try
    ??{
    ???o = super.clone();
    ??}
    ??catch(CloneNotSupportedException e)
    ??{
    ???System.out.println(e.getMessage());
    ??}
    ??return o;
    ?}
    }

    這里有個疑問了,為什么我們要在派生類中over writte Object的clone()方法時,一定要調用super.clone()呢?
    原因是: 在運行時刻,Object中的clone()識別出你要clone的是哪一個對象,然后為此對象分配內存空間,并進行對象的復制,將原始對象的內容一一復制到新的對象空間中去。

    posted on 2007-03-12 15:30 yok 閱讀(181) 評論(0)  編輯  收藏 所屬分類: CoreJava
    主站蜘蛛池模板: 亚洲人成精品久久久久| 亚洲香蕉网久久综合影视| 自拍偷自拍亚洲精品情侣| 久久国产亚洲高清观看| 亚洲精品无码你懂的| 最新久久免费视频| 成人啪精品视频免费网站| 亚洲日韩精品无码一区二区三区| 亚洲AV无码成人专区| 一个人免费观看视频在线中文| 亚洲成年人免费网站| 亚洲黄片毛片在线观看| 亚洲国产理论片在线播放| 人人鲁免费播放视频人人香蕉| 91在线手机精品免费观看| 亚洲AV成人潮喷综合网| 成年人免费视频观看| 好看的亚洲黄色经典| 亚洲变态另类一区二区三区| 久久不见久久见免费视频7| 午夜亚洲福利在线老司机| 亚洲人成人77777网站不卡| 成人免费无码H在线观看不卡| 天天操夜夜操免费视频| 亚洲人成在线播放网站岛国| 无遮挡国产高潮视频免费观看| 黄瓜视频影院在线观看免费| 国产精一品亚洲二区在线播放| 国产精品无码亚洲一区二区三区| 亚洲免费电影网站| 国产精品亚洲片在线| 日本黄页网址在线看免费不卡| 国产麻豆视频免费观看| 亚洲成a人片77777老司机| 美女被免费视频网站| 成人片黄网站色大片免费| 亚洲精品视频观看| 国产一区二区三区免费| 亚洲中文字幕视频国产| 久久亚洲AV成人无码国产最大| 无码国产精品一区二区免费式直播 |