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

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

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

    拼搏的人生

    拼搏在繁華的都市

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

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

    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;
    ? ?}
    }
    運(yùn)行結(jié)果如下:
    F:\Java Develop>javac TestClone.java
    F:\Java Develop>java TestClone
    name=Dog,weight=50
    我們看到我們修改an2的值并沒(méi)有影響到an1里的值,這就是克隆的作用.是因?yàn)樵谶@里通過(guò)Clone我們?cè)趦?nèi)存中有2塊地方用來(lái)儲(chǔ)存不同的an1,an2
    我們?cè)诳聪旅嬉粋€(gè)例子,我們?cè)僭黾右粋€(gè)動(dòng)物的飼養(yǎng)員類(lèi),來(lái)相關(guān)到具體的每個(gè)動(dòng)物.
    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é)果可以看出來(lái)我們修改了an2.f.name和an.f.age但是an1去發(fā)生了變化,這是因?yàn)槲覀儧](méi)有對(duì)Feeder類(lèi)進(jìn)行克隆,這就是淺克隆,為了解決這個(gè)問(wèn)題我們需要用到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類(lèi)里所有沒(méi)有引用類(lèi)型的變量.Deeply Clone則剛好相反.

    posted on 2006-05-07 21:52 Dalston.Young 閱讀(316) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): Java Core

    評(píng)論

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


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久久久久久久久免免费精品| 国产精品久久永久免费| 日韩精品无码人妻免费视频| 四虎影视免费永久在线观看| 亚洲av永久无码精品秋霞电影影院| 日韩色日韩视频亚洲网站| 久久爰www免费人成| 久久激情亚洲精品无码?V| 永久免费无码日韩视频| 久久久青草青青国产亚洲免观| 一级做a毛片免费视频| 91免费精品国自产拍在线不卡| 亚洲国产精品成人精品小说| 国产精品成人免费福利| 亚洲欧美国产日韩av野草社区| 成人永久免费高清| 免费无遮挡无遮羞在线看| 全免费a级毛片免费看无码| 亚洲大香人伊一本线| 91免费国产在线观看| 亚洲av永久无码天堂网| 无人在线直播免费观看| 国产亚洲精品va在线| 无码成A毛片免费| 久久精品国产亚洲夜色AV网站| 最近免费字幕中文大全视频| 亚洲国产精品一区二区三区在线观看| 中字幕视频在线永久在线观看免费| 亚洲中文无码亚洲人成影院| 国产免费一区二区三区VR| 久久性生大片免费观看性| 亚洲香蕉免费有线视频| 国产午夜免费高清久久影院| 亚洲成电影在线观看青青| 国产又粗又猛又爽又黄的免费视频 | 一级毛片高清免费播放| 久久久久亚洲AV片无码| 国产又黄又爽胸又大免费视频| 亚洲中文字幕丝袜制服一区| 无码毛片一区二区三区视频免费播放| 亚洲日韩激情无码一区|