版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1淺復(fù)制與深復(fù)制概念淺復(fù)制(淺克隆)被復(fù)制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引 用仍然指向原來的對象。換言之,淺復(fù)制僅僅復(fù)制所考慮的對象,而不 復(fù)制它所引用的對象。深復(fù)制(深克隆)被復(fù)制對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的 變量。那些引用其他對象的變量將指向被復(fù)制過的新對象,而不再是原有的那些被引用的對象。換言之,深復(fù)制把要復(fù)制的對象所引用的對象都復(fù)制了 一遍。2. Java 的 clone()方法clone方法將對象復(fù)制了一份并返回給調(diào)用者。一般而言,clone ()方法滿 足:對任何的對象x,都有x.clo ne() !=x克隆對象與
2、原對象不是同一個對象對任何的對象x,都有x.clone().getClass()= =x.getClass()克隆對象與 原對象的類型一樣如果對象x的equals。方法定義恰當(dāng),那么x.clone().equals(x)應(yīng)該成立。(2)Java中對象的克隆為了獲取對象的一份拷貝,我們可以利用Object類的clone()方法。在派生類中覆蓋基類的clone()方法,并聲明為public。在派生類的clone()方法中,調(diào)用super.clone()。在派生類中實現(xiàn) Cloneable 接口。請看如下代碼:class Student implements CloneableString name
3、;int age;Student(String name,int age)=name;this.age=age;public Object clone()Object o=null;tryo=(Student)super.clone();0bject 中的 clone()識別出你要復(fù)制的是哪 一個對象。catch(CloneNotSupportedException e)System.out.println(e.toString();return o;public static void main(String args)Student s1=new Student(zhan
4、gsan,18);Student s2=(Student)s1.clone();=lisi;s2.age=20;System.out.pri ntln(n ame=+s1 .n ame+,+age=+s1.age);/ 修改 學(xué)生 2后,不影響學(xué)生 1 的值。說明:為什么我們在派生類中覆蓋Object的clone()方法時,一定要調(diào)用 super.clone()呢?在運行時刻,Object中的clone()識別出你要復(fù)制的是哪一 個對象,然后為此對象分配空間,并進(jìn)行對象的復(fù)制,將原始對象的內(nèi)容一一復(fù) 制到新對象的存儲空間中。繼承自java.lang.Object類的clone()
5、方法是淺復(fù)制。以下代碼可以證明之。class ProfessorString name;int age;Professor(String name,int age)=name;this.age=age;class Student implements CloneableString name;/ 常量對象。int age;Professor p;/ 學(xué)生1和學(xué)生2的引用值都是一樣的。Student(String name,int age,Professor p)=name;this.age=age;this.p=p;public Object clone()
6、Student o=null;try o=(Student)super.clone(); catch(CloneNotSupportedException e)System.out.println(e.toString();return o;public static void main(String args)Professor p=new Professor(wangwu,50);Student s1=new Student(zhangsan,18,p);Student s2=(Student)s1.clone();=lisi;s2.p.age=30;System.out
7、.println(name=++,+age=+s1.p.age);/ 學(xué)生 1 的教授成為 lisi,age 為 30。那應(yīng)該如何實現(xiàn)深層次的克隆,即修改s2的教授不會影響si的教授?代碼改 進(jìn)如下。改進(jìn)使學(xué)生 1 的 Professor 不改變(深層次的克隆)class Professor implements CloneableString name;int age;Professor(String name,int age)=name;this.age=age;public Object clone()Object o=null;tryo=super.
8、clone(); catch(CloneNotSupportedException e)System.out.println(e.toString();return o;class Student implements CloneableString name;int age;Professor p;Student(String name,int age,Professor p) =name; this.age=age;this.p=p;public Object clone()Student o=null;tryo=(Student)super.clone(); catch
9、(CloneNotSupportedException e)System.out.println(e.toString();o.p=(Professor)p.clone();return o;public static void main(String args)Professor p=new Professor(wangwu,50);Student s1=new Student(zhangsan,18,p);Student s2=(Student)s1.clone();=lisi;s2.p.age=30;System.out.println(name=++
10、,+age=+s1.p.age);/ 學(xué)生 1的教授不 改變。3利用串行化來做深復(fù)制把對象寫到流里的過程是串行化(Serilization)過程,但是在Java程序師圈 子里又非常形象地稱為冷凍或者腌咸菜(picking) 過程;而把對象從流中 讀出來的并行化(Deserialization)過程則叫做 解凍”或者回鮮(depicking)” 過程。應(yīng)當(dāng)指出的是,寫在流里的是對象的一個拷貝,而原對象仍然存在于JVM里面, 因此腌成咸菜的只是對象的一個拷貝,Java咸菜還可以回鮮。在 Java 語言里深復(fù)制一個對象,常??梢韵仁箤ο髮崿F(xiàn) Serializable 接口,然 后把對象(實際上只是對
11、象的一個拷貝)寫到一個流里(腌成咸菜),再從流里 讀出來(把咸菜回鮮),便可以重建對象。如下為深復(fù)制源代碼。public Object deepClone()/將對象寫到流里ByteArrayOutoutStream bo=new ByteArrayOutputStream(); ObjectOutputStream oo=new ObjectOutputStream(bo); oo.writeObject(this);/從流里讀出來ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray();ObjectInputStre
12、am oi=new ObjectInputStream(bi); return(oi.readObject();這樣做的前提是對象以及對象內(nèi)部所有引用到的對象都是可串行化的,否則,就 需要仔細(xì)考察那些不可串行化的對象可否設(shè)成transient,從而將之排除在復(fù)制 過程之外。上例代碼改進(jìn)如下。class Teacher implements SerializableString name;int age;Teacher(String name,int age)=name;this.age=age;class Student implements SerializableStri
13、 ng n ame; 常量對象int age;Teacher t;學(xué)生1和學(xué)生2的引用值都是一樣的。Student(String name,int age,Teacher t) =name;this.age=age;this.p=p;public Object deepClone() throws IOException,Optio nalDataExceptio n,ClassNotFo un dExceptio n 將對象寫到流里 ByteArrayOutoutStream bo=new ByteArrayOutputStream(); ObjectOutputStream oo=new ObjectOutputStream(bo); oo.writeObject(this);/ 從流里讀出來ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray();ObjectInputStream oi=new ObjectInputStream(bi); return(oi.readObject();public static void main(S
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年瓊臺師范學(xué)院單招職業(yè)技能測試題庫附答案詳解
- 2026年廊坊職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫及完整答案詳解1套
- 2026年廈門工學(xué)院單招職業(yè)傾向性考試題庫含答案詳解
- 2026年上海興偉學(xué)院單招職業(yè)技能考試題庫及參考答案詳解
- 2026年桐城師范高等??茖W(xué)校單招職業(yè)傾向性考試題庫及參考答案詳解一套
- 2026年伊犁職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試題庫及完整答案詳解1套
- 2026年貴州航天職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試題庫帶答案詳解
- 2026年天津機(jī)電職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫及參考答案詳解
- 2026年內(nèi)江衛(wèi)生與健康職業(yè)學(xué)院單招職業(yè)技能考試題庫參考答案詳解
- 2026年桂林山水職業(yè)學(xué)院單招職業(yè)適應(yīng)性考試題庫參考答案詳解
- 穿越機(jī)入門教學(xué)課件
- 《二次根式的混合運算》教學(xué)設(shè)計
- 地質(zhì)災(zāi)害危險性評估方案報告
- 感術(shù)行動培訓(xùn)課件
- DB44∕T 2552-2024 藥物臨床試驗倫理審查規(guī)范
- 血管外科第三集講解
- 跨區(qū)域文化協(xié)作-洞察及研究
- 2025 易凱資本中國健康產(chǎn)業(yè)白皮書 -生物制造篇(與茅臺基金聯(lián)合發(fā)布)
- 產(chǎn)業(yè)經(jīng)濟(jì)學(xué)(蘇東坡版)課后習(xí)題及答案
- T/CECS 10227-2022綠色建材評價屋面綠化材料
- 區(qū)域醫(yī)學(xué)檢驗中心項目建設(shè)方案
評論
0/150
提交評論