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

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

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

    拼搏的人生

    拼搏在繁華的都市

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      7 隨筆 :: 13 文章 :: 6 評論 :: 0 Trackbacks

    ????我們知道在Java在java中,傳參時,都是以傳值的形式進行。對于基本數據類型,傳遞的是數據的拷貝,對于引用類型,傳遞的引用的拷貝。為了獲取對象的一份拷貝,我們可以利用Object類的clone()方法。至于怎么樣來實現Clone我們必須做以下的事情:
    1> 在派生類中覆蓋基類的clone(),并聲明為public。
    2> 在派生類的clone()方法中,調用super.clone()。
    3> 在派生類中實現Cloneable接口。
    4> 沒有抽象方法的接口叫標識接口。
    5> 為什么我們在派生類中覆蓋Object的clone()方法時,一定要調用super.clone()呢?在運行時刻,Object
    ?? 的clone()方法能識別出你要復制的是哪一個對象,然后為此對象分配空間,并進行對象的復制,將原
    ?? 始對象的內容一一復制到新的對象空間去。
    我們看下面的例子:

    class TestClone
    {
    ?public static void main(String[] args)
    ? ?{
    ????? Animal an1=new Animal("Dog",50);
    ???? ?Animal an2=(Animal)an1.clone();
    ??????an2.name="Fox";
    ??? ??an2.weight=30;
    ???? ?System.out.println(an1);
    ?? ?}
    }
    class Animal implements Cloneable
    {
    ?? String name;
    ?? int weight;
    ?public Animal(String name,int weight)
    ?? {
    ?????? this.name=name;
    ???? ? this.weight=weight;
    ?? }
    ?public String toString()
    ? {
    ????? ?return "name="+name+","+"weight="+weight;
    ? }
    ?public Object clone()
    ??{
    ???? Object o=null;
    ??try
    ?? ?{
    ????? ?o=super.clone();
    ??? ?}
    ??catch(CloneNotSupportedException e)
    ??{
    ?????? System.out.println(e.toString());
    ??}
    ???? ?return o;
    ? ?}
    }
    運行結果如下:
    F:\Java Develop>javac TestClone.java
    F:\Java Develop>java TestClone
    name=Dog,weight=50
    我們看到我們修改an2的值并沒有影響到an1里的值,這就是克隆的作用.是因為在這里通過Clone我們在內存中有2塊地方用來儲存不同的an1,an2
    我們在看下面一個例子,我們再增加一個動物的飼養員類,來相關到具體的每個動物.
    class TestClone
    {
    ?public static void main(String[] args)
    ?{
    ??Feeder f=new Feeder("google",50);
    ??Animal an1=new Animal("Dog",50,f);
    ??Animal an2=(Animal)an1.clone();
    ??an2.f.name="baidu";
    ??an2.f.age=60;
    ??System.out.println(an1.f.name);
    ??System.out.println(an1.f.age);
    ?}
    }

    /*
    class Feeder implements Cloneable
    {
    ?String name;
    ?int age;
    ?public Feeder(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 Feeder
    {
    ?String name;
    ?int age;
    ?public Feeder(String name,int age)
    ?{
    ??this.name=name;
    ??this.age=age;
    ?}
    }

    class Animal implements Cloneable
    {
    ?String name;
    ?int weight;
    ?Feeder f;
    ?public Animal(String name,int weight,Feeder f)
    ?{
    ??this.name=name;
    ??this.weight=weight;
    ??this.f=f;
    ?}
    ?public String toString()
    ?{
    ??return "name="+name+","+"weight="+weight;
    ?}
    ?public Object clone()
    ?{
    ??Object o=null;
    ??//Animal o=null;
    ??try
    ??{
    ???o=super.clone();
    ??}
    ??catch(CloneNotSupportedException e)
    ??{
    ???System.out.println(e.toString());
    ??}
    ??//o.f=(Feeder)f.clone();
    ??return o;
    ?}
    }
    我們看輸出結果:
    F:\Java Develop>javac TestClone.java
    F:\Java Develop>java TestClone
    baidu
    60
    從結果可以看出來我們修改了an2.f.name和an.f.age但是an1去發生了變化,這是因為我們沒有對Feeder類進行克隆,這就是淺克隆,為了解決這個問題我們需要用到Deeply克隆,java默認的克隆方式是淺克隆.
    代碼如下:
    class TestClone
    {
    ?public static void main(String[] args)
    ?{
    ??Feeder f=new Feeder("google",50);
    ??Animal an1=new Animal("Dog",50,f);
    ??Animal an2=(Animal)an1.clone();
    ??an2.f.name="baidu";
    ??an2.f.age=60;
    ??System.out.println(an1.f.name);
    ??System.out.println(an1.f.age);
    ?}
    }

    class Feeder implements Cloneable
    {
    ?String name;
    ?int age;
    ?public Feeder(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 Animal implements Cloneable
    {
    ?String name;
    ?int weight;
    ?Feeder f;
    ?public Animal(String name,int weight,Feeder f)
    ?{
    ??this.name=name;
    ??this.weight=weight;
    ??this.f=f;
    ?}
    ?public String toString()
    ?{
    ??return "name="+name+","+"weight="+weight;
    ?}
    ?public Object clone()
    ?{
    ??//Object o=null;
    ??Animal o=null;
    ??try
    ??{
    ???o=(Animal)super.clone();
    ??}
    ??catch(CloneNotSupportedException e)
    ??{
    ???System.out.println(e.toString());
    ??}
    ??o.f=(Feeder)f.clone();
    ??return o;
    ?}
    }
    輸出結果如下:
    F:\Java Develop>javac TestClone.java
    F:\Java Develop>java TestClone
    google
    50
    java淺克隆是指copy類里所有沒有引用類型的變量.Deeply Clone則剛好相反.

    posted on 2006-05-07 21:52 Dalston.Young 閱讀(320) 評論(1)  編輯  收藏 所屬分類: Java Core

    評論

    # re: 淺談Java的Clone 2006-11-20 16:35 坎井之蛙
    通俗易懂!3Q!  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: 天堂在线免费观看中文版| 亚洲精品WWW久久久久久| 亚洲精品9999久久久久无码| 四虎精品亚洲一区二区三区| 日本视频免费高清一本18| 亚洲国产精品综合久久20| 成人亚洲综合天堂| 777爽死你无码免费看一二区| 亚洲乱人伦中文字幕无码| 亚洲精品国产精品乱码在线观看 | 一日本道a高清免费播放 | 人妻巨大乳hd免费看| 亚洲AV日韩精品久久久久| 国产精品冒白浆免费视频| 免费在线中文日本| 亚洲夂夂婷婷色拍WW47| 亚洲国产精品嫩草影院在线观看 | 亚洲综合最新无码专区| 4455永久在线观免费看| www一区二区www免费| 亚洲春色另类小说| 中文字幕人成人乱码亚洲电影| 最近最新中文字幕完整版免费高清| a级毛片免费观看在线| 亚洲中文字幕无码av| 亚洲天天在线日亚洲洲精| 亚洲AV永久无码精品一区二区国产| 亚洲免费电影网站| 国产无遮挡又黄又爽免费网站| 亚洲精品美女久久久久久久| 亚洲成年轻人电影网站www| 久久亚洲欧洲国产综合| 国产真实伦在线视频免费观看| 91频在线观看免费大全| 另类免费视频一区二区在线观看| 国产精品亚洲精品爽爽| 亚洲综合小说另类图片动图| 亚洲精品国产情侣av在线| 国产亚洲精品资源在线26u| 亚洲综合精品网站在线观看| 国产成人免费a在线视频色戒|