




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1淺復(fù)制與深復(fù)制概念淺復(fù)制(淺克隆)被復(fù)制對(duì)象的所有變量都含有與原來的對(duì)象相同的值,而所有的對(duì)其他對(duì)象的引 用仍然指向原來的對(duì)象。換言之,淺復(fù)制僅僅復(fù)制所考慮的對(duì)象,而不 復(fù)制它所引用的對(duì)象。深復(fù)制(深克隆)被復(fù)制對(duì)象的所有變量都含有與原來的對(duì)象相同的值,除去那些引用其他對(duì)象的 變量。那些引用其他對(duì)象的變量將指向被復(fù)制過的新對(duì)象,而不再是原有的那些被引用的對(duì)象。換言之,深復(fù)制把要復(fù)制的對(duì)象所引用的對(duì)象都復(fù)制了 一遍。2. Java 的 clone()方法clone方法將對(duì)象復(fù)制了一份并返回給調(diào)用者。一般而言,clone ()方法滿 足:對(duì)任何的對(duì)象x,都有x.clo ne() !=x克隆對(duì)象與
2、原對(duì)象不是同一個(gè)對(duì)象對(duì)任何的對(duì)象x,都有x.clone().getClass()= =x.getClass()克隆對(duì)象與 原對(duì)象的類型一樣如果對(duì)象x的equals。方法定義恰當(dāng),那么x.clone().equals(x)應(yīng)該成立。(2)Java中對(duì)象的克隆為了獲取對(duì)象的一份拷貝,我們可以利用Object類的clone()方法。在派生類中覆蓋基類的clone()方法,并聲明為public。在派生類的clone()方法中,調(diào)用super.clone()。在派生類中實(shí)現(xiàn) Cloneable 接口。請(qǐng)看如下代碼: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()識(shí)別出你要復(fù)制的是哪 一個(gè)對(duì)象。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 的值。說明:為什么我們?cè)谂缮愔懈采wObject的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ì)象的存儲(chǔ)空間中。繼承自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;/ 常量對(duì)象。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)該如何實(shí)現(xiàn)深層次的克隆,即修改s2的教授不會(huì)影響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ù)制把對(duì)象寫到流里的過程是串行化(Serilization)過程,但是在Java程序師圈 子里又非常形象地稱為冷凍或者腌咸菜(picking) 過程;而把對(duì)象從流中 讀出來的并行化(Deserialization)過程則叫做 解凍”或者回鮮(depicking)” 過程。應(yīng)當(dāng)指出的是,寫在流里的是對(duì)象的一個(gè)拷貝,而原對(duì)象仍然存在于JVM里面, 因此腌成咸菜的只是對(duì)象的一個(gè)拷貝,Java咸菜還可以回鮮。在 Java 語言里深復(fù)制一個(gè)對(duì)象,常常可以先使對(duì)象實(shí)現(xiàn) Serializable 接口,然 后把對(duì)象(實(shí)際上只是對(duì)
11、象的一個(gè)拷貝)寫到一個(gè)流里(腌成咸菜),再?gòu)牧骼?讀出來(把咸菜回鮮),便可以重建對(duì)象。如下為深復(fù)制源代碼。public Object deepClone()/將對(duì)象寫到流里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();這樣做的前提是對(duì)象以及對(duì)象內(nèi)部所有引用到的對(duì)象都是可串行化的,否則,就 需要仔細(xì)考察那些不可串行化的對(duì)象可否設(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; 常量對(duì)象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 將對(duì)象寫到流里 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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)過氧化鋅市場(chǎng)發(fā)展現(xiàn)狀及前景趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)調(diào)壓箱市場(chǎng)發(fā)展?fàn)顩r及營(yíng)銷戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)裝飾天花板制造行業(yè)運(yùn)行狀況及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 2025-2030年中國(guó)蜜蜂養(yǎng)殖與蜂產(chǎn)品加工行業(yè)運(yùn)營(yíng)狀況與發(fā)展?jié)摿Ψ治鰣?bào)告
- 2025-2030年中國(guó)萵苣和菊苣行業(yè)運(yùn)營(yíng)狀況與發(fā)展?jié)摿Ψ治鰣?bào)告
- 2025-2030年中國(guó)膜片式微孔曝氣器行業(yè)前景趨勢(shì)及發(fā)展?jié)摿Ψ治鰣?bào)告
- 2025-2030年中國(guó)聚萘二甲酸乙二醇酯pen行業(yè)運(yùn)行趨勢(shì)及投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)粗糧飲料市場(chǎng)發(fā)展趨勢(shì)及前景調(diào)研分析報(bào)告
- 2025-2030年中國(guó)硝酸異辛酯行業(yè)運(yùn)行狀況及發(fā)展趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)眼影市場(chǎng)運(yùn)行現(xiàn)狀及發(fā)展前景分析報(bào)告
- 3.1產(chǎn)業(yè)轉(zhuǎn)移對(duì)區(qū)域發(fā)展的影響(第1課時(shí)) 【知識(shí)精研】高二地理課件(湘教版2019選擇性必修2)
- 2025年醫(yī)院實(shí)習(xí)協(xié)議書樣本
- 2025年湖南工程職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 2024年云南中煙工業(yè)有限責(zé)任公司招聘筆試真題
- 2024年山東輕工職業(yè)學(xué)院高職單招語文歷年參考題庫(kù)含答案解析
- 三一重工全面預(yù)算管理
- 小公司財(cái)務(wù)報(bào)銷制度及報(bào)銷流程
- 2022新教材蘇教版科學(xué)5五年級(jí)下冊(cè)全冊(cè)教學(xué)設(shè)計(jì)
- 2024-2025學(xué)年全國(guó)中學(xué)生天文知識(shí)競(jìng)賽考試題庫(kù)(含答案)
- 加利福尼亞批判性思維技能測(cè)試后測(cè)試卷班附有答案
- 工程結(jié)算書(完整版)
評(píng)論
0/150
提交評(píng)論