拼搏的人生

          拼搏在繁華的都市

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

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

          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;
          ? ?}
          }
          運行結(jié)果如下:
          F:\Java Develop>javac TestClone.java
          F:\Java Develop>java TestClone
          name=Dog,weight=50
          我們看到我們修改an2的值并沒有影響到an1里的值,這就是克隆的作用.是因為在這里通過Clone我們在內(nèi)存中有2塊地方用來儲存不同的an1,an2
          我們在看下面一個例子,我們再增加一個動物的飼養(yǎng)員類,來相關(guān)到具體的每個動物.
          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;
          ?}
          }
          我們看輸出結(jié)果:
          F:\Java Develop>javac TestClone.java
          F:\Java Develop>java TestClone
          baidu
          60
          從結(jié)果可以看出來我們修改了an2.f.name和an.f.age但是an1去發(fā)生了變化,這是因為我們沒有對Feeder類進行克隆,這就是淺克隆,為了解決這個問題我們需要用到Deeply克隆,java默認(rèn)的克隆方式是淺克隆.
          代碼如下:
          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;
          ?}
          }
          輸出結(jié)果如下:
          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 閱讀(316) 評論(1)  編輯  收藏 所屬分類: Java Core

          評論

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


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 郎溪县| 同心县| 荔波县| 社会| 南澳县| 洮南市| 巴彦县| 双柏县| 理塘县| 德阳市| 海南省| 遂川县| 彰武县| 尼勒克县| 永宁县| 中方县| 盘锦市| 沙雅县| 余江县| 曲阳县| 桑日县| 富裕县| 海丰县| 莎车县| 遂宁市| 桃园市| 吉安县| 兴文县| 满洲里市| 尼木县| 叶城县| 伊宁县| 灵寿县| 新竹县| 加查县| 蒙山县| 进贤县| 扬州市| 敦化市| 天祝| 垫江县|