




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選文檔Java中對(duì)象的深復(fù)制和淺復(fù)制詳解1淺復(fù)制與深復(fù)制概念淺復(fù)制(淺克隆)被復(fù)制對(duì)象的全部變量都含有與原來(lái)的對(duì)象相同的值,而全部的對(duì)其他對(duì)象的引用仍舊指向原來(lái)的對(duì)象。換言之,淺復(fù)制僅僅復(fù)制所考慮的對(duì)象,而不復(fù)制它所引用的對(duì)象。深復(fù)制(深克?。┍粡?fù)制對(duì)象的全部變量都含有與原來(lái)的對(duì)象相同的值,除去那些引用其他對(duì)象的變量。那些引用其他對(duì)象的變量將指向被復(fù)制過(guò)的新對(duì)象,而不再是原有的那些被引用的對(duì)象。換言之,深復(fù)制把要復(fù)制的對(duì)象所引用的對(duì)象都復(fù)制了一遍。2Java的clone()方法clone方法將對(duì)象復(fù)制了一份并返回給調(diào)用者。一般而言,clone()方法滿足:對(duì)任何的對(duì)象x,都有x.clone(
2、) !=x/克隆對(duì)象與原對(duì)象不是同一個(gè)對(duì)象對(duì)任何的對(duì)象x,都有x.clone().getClass()= =x.getClass()/克隆對(duì)象與原對(duì)象的類型一樣假如對(duì)象x的equals()方法定義恰當(dāng),那么x.clone().equals(x)應(yīng)當(dāng)成立。Java中對(duì)象的克隆為了獵取對(duì)象的一份拷貝,我們可以利用Object類的clone()方法。在派生類中掩蓋基類的clone()方法,并聲明為public。在派生類的clone()方法中,調(diào)用super.clone()。在派生類中實(shí)現(xiàn)Cloneable接口。請(qǐng)看如下代碼:1. public class Student
3、;implements Cloneable 2. 3. String name; 4. int age; 5. Student(String name,int age) 6. 7. =name; 8. this.age=age; 9. 10. public Object
4、clone() 11. 12. Object o=null; 13. try 14. 15. o=(Student)super.clone();/Object 中的clone()識(shí)別出你要復(fù)制的是哪一個(gè)對(duì)象。 16. 17. catch(CloneNotSupportedExceptio
5、n e) 18. 19. System.out.println(e.toString(); 20. 21. return o; 22. 23. 24. public static void main(String args) 25. 2
6、6. Student s1=new Student("zhangsan",18); 27. Student s2=(Student)s1.clone(); 28. ="lisi" 29. s2.age=20; 30. /修改同學(xué)2后,不影響同學(xué)1的值。 31. System.out.println("name=
7、"++","+"age="+s1.age); 32. System.out.println("name="++","+"age="+s2.age); 33. 34. 說(shuō)明:為什么我們?cè)谂缮愔醒谏wObject的clone()方法時(shí),肯定要調(diào)用super.clone()呢?在運(yùn)行時(shí)刻,Object中的 clone() 識(shí)別出你要復(fù)制的是哪一個(gè)對(duì)象,然后為此對(duì)象安排空間,并進(jìn)行對(duì)象的復(fù)制,將原始
8、對(duì)象的內(nèi)容一一復(fù)制到新對(duì)象的存儲(chǔ)空間中。繼承自java.lang.Object類的clone()方法是淺復(fù)制。以下代碼可以證明之。1. class Professor 2. 3. String name; 4. int age; 5. Professor(String name,int age) 6. 7. =name; 8.
9、0; this.age=age; 9. 10. 11. public class Student implements Cloneable 12. 13. String name;/ 常量對(duì)象。 14. int age; 15. Professor p;/ 同學(xué)1和同學(xué)2的引用值都是一樣的。 16.
10、160;Student(String name,int age,Professor p) 17. 18. =name; 19. this.age=age; 20. this.p=p; 21. 22. public Object clone() 23. 24. Stu
11、dent o=null; 25. try 26. 27. o=(Student)super.clone(); 28. 29. catch(CloneNotSupportedException e) 30. 31. System.out.println(
12、e.toString(); 32. 33. o.p=(Professor)p.clone(); 34. return o; 35. 36. public static void main(String args) 37. 38. Professor p=new Professor("wa
13、ngwu",50); 39. Student s1=new Student("zhangsan",18,p); 40. Student s2=(Student)s1.clone(); 41. ="lisi" 42. s2.p.age=30; 43. System.out.println("name="
14、;++","+"age="+s1.p.age); 44. System.out.println("name="++","+"age="+s2.p.age); 45. /輸出結(jié)果同學(xué)1和2的教授成為lisi,age為30。 46. 47. 那應(yīng)當(dāng)如何實(shí)現(xiàn)深層次的克隆,即修改s2的教授不會(huì)影響s1的教授?代碼改進(jìn)如下。改進(jìn)使同學(xué)1的Prof
15、essor不轉(zhuǎn)變(深層次的克隆)1. class Professor implements Cloneable 2. 3. String name; 4. int age; 5. Professor(String name,int age) 6. 7. =name; 8. this.age=a
16、ge; 9. 10. public Object clone() 11. 12. Object o=null; 13. try 14. 15. o=super.clone(); 16. 17. catch(CloneNo
17、tSupportedException e) 18. 19. System.out.println(e.toString(); 20. 21. return o; 22. 23. 24. public class Student implements Cloneable 25.
18、160;26. String name; 27. int age; 28. Professor p; 29. Student(String name,int age,Professor p) 30. 31. =name; 32. this.age=age; 33.
19、160;this.p=p; 34. 35. public Object clone() 36. 37. Student o=null; 38. try 39. 40. o=(Student)super.clone(); 41. 42.
20、0; catch(CloneNotSupportedException e) 43. 44. System.out.println(e.toString(); 45. 46. /對(duì)引用的對(duì)象也進(jìn)行復(fù)制 47. o.p=(Professor)p.clone(); 48. return o;&
21、#160;49. 50. public static void main(String args) 51. 52. Professor p=new Professor("wangwu",50); 53. Student s1=new Student("zhangsan",18,p); 54.
22、Student s2=(Student)s1.clone(); 55. ="lisi" 56. s2.p.age=30; 57. /同學(xué)1的教授不 轉(zhuǎn)變。 58. System.out.println("name="++","+"age="+s1.p.age); 59. System.out.
23、println("name="++","+"age="+s2.p.age); 60. 61. 3利用串行化來(lái)做深復(fù)制(主要是為了避開(kāi)重寫比較簡(jiǎn)單對(duì)象的深復(fù)制的clone()方法,也可以程序?qū)崿F(xiàn)斷點(diǎn)續(xù)傳等等功能)把對(duì)象寫到流里的過(guò)程是串行化(Serilization)過(guò)程,但是在Java程序師圈子里又格外形象地稱為“冷凍”或者“腌咸菜 (picking)” 過(guò)程;而把對(duì)象從流中讀出來(lái)的并行化(Deserialization)過(guò)程則叫做 “解凍”或者“回鮮(depicking)”過(guò)程。應(yīng)
24、當(dāng)指出的是,寫在流里的是對(duì)象的一個(gè)拷貝,而原對(duì)象仍舊存在于JVM里面,因此“腌成咸菜”的只是對(duì)象的一個(gè)拷貝,Java咸菜還可以回鮮。在Java語(yǔ)言里深復(fù)制一個(gè)對(duì)象,經(jīng)??梢韵仁箤?duì)象實(shí)現(xiàn)Serializable接口,然后把對(duì)象(實(shí)際上只是對(duì)象的一個(gè)拷貝)寫到一個(gè)流里(腌成咸菜),再?gòu)牧骼镒x出來(lái)(把咸菜回鮮),便可以重建對(duì)象。如下為深復(fù)制源代碼。1. public Object deepClone() 2. 3. /將對(duì)象寫到流里 4. ByteArrayOutoutStream bo=new ByteArrayOutputS
25、tream(); 5. ObjectOutputStream oo=new ObjectOutputStream(bo); 6. oo.writeObject(this); 7. /從流里讀出來(lái) 8. ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray(); 9. ObjectInputStream oi=new ObjectInputStream(bi); 10. return(oi.readObj
26、ect(); 11. 這樣做的前提是對(duì)象以及對(duì)象內(nèi)部全部引用到的對(duì)象都是可串行化的,否則,就需要認(rèn)真考察那些不行串行化的對(duì)象或?qū)傩钥煞裨O(shè)成transient,從而將之排解在復(fù)制過(guò)程之外。上例代碼改進(jìn)如下。1. class Teacher implements Serializable 2. String name; 3. int age; 4. public void Teacher(String
27、60;name,int age) 5. =name; 6. this.age=age; 7. 8. 9. public class Student implements Serializable 10. String name;/常量對(duì)象 11. int age; 12. Teacher t;/同學(xué)1和同學(xué)2的引用值都是一樣的。 13
28、. public void Student(String name,int age,Teacher t) 14. =name; 15. this.age=age; 16. this.p=p; 17. 18. public Object deepClone() throws IOException, 19. OptionalDataException,ClassNotFoundException/將對(duì)象寫到流里 20. ByteArrayOutoutStream bo=new ByteArrayOu
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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-2026學(xué)年惠東縣三年級(jí)數(shù)學(xué)第一學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)試題含解析
- 2024年南陵縣三年級(jí)數(shù)學(xué)第一學(xué)期期末監(jiān)測(cè)試題含解析
- 2024年凌海市數(shù)學(xué)三上期末教學(xué)質(zhì)量檢測(cè)模擬試題含解析
- 2025年執(zhí)業(yè)醫(yī)師考試實(shí)戰(zhàn)試題及答案
- 文化的傳播與傳播學(xué)試題及答案
- 2025年主管護(hù)師考試的答題技巧試題及答案
- 行政法學(xué)考點(diǎn)速記分享:試題及答案
- 藥物經(jīng)濟(jì)學(xué)的應(yīng)用與執(zhí)業(yè)藥師試題及答案
- 環(huán)境變化對(duì)文化傳承的影響試題及答案
- 2025年衛(wèi)生資格考試的市場(chǎng)需求試題及答案
- 2025年中考理化生實(shí)驗(yàn)操作考試考務(wù)培訓(xùn)大綱
- 2021年高考地理試卷(全國(guó)甲卷)(空白卷)
- 2025年重慶西南大學(xué)附中高考數(shù)學(xué)模擬試卷試題(含答案詳解)
- 2025四川巴中市國(guó)有資本運(yùn)營(yíng)集團(tuán)有限公司招聘17人筆試參考題庫(kù)附帶答案詳解
- 2025神農(nóng)科技集團(tuán)有限公司第一批校園招聘17人(山西)筆試參考題庫(kù)附帶答案詳解
- 2024初級(jí)社會(huì)工作者職業(yè)資格筆試題庫(kù)附答案
- 南充2025年南充市公安局第一次招聘27名交通輔警筆試歷年參考題庫(kù)附帶答案詳解
- 收購(gòu)芒果協(xié)議書模板
- 農(nóng)業(yè)科技與裝備應(yīng)用知識(shí)考點(diǎn)
- 雙語(yǔ)客運(yùn)值班員紅十字藥箱課件
- 黑龍江省地方標(biāo)準(zhǔn)黑龍江省建設(shè)工程施工操作技術(shù)規(guī)程市政橋梁工程
評(píng)論
0/150
提交評(píng)論