版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、精選文檔Java中對象的深復(fù)制和淺復(fù)制詳解1淺復(fù)制與深復(fù)制概念淺復(fù)制(淺克?。┍粡?fù)制對象的全部變量都含有與原來的對象相同的值,而全部的對其他對象的引用仍舊指向原來的對象。換言之,淺復(fù)制僅僅復(fù)制所考慮的對象,而不復(fù)制它所引用的對象。深復(fù)制(深克?。┍粡?fù)制對象的全部變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被復(fù)制過的新對象,而不再是原有的那些被引用的對象。換言之,深復(fù)制把要復(fù)制的對象所引用的對象都復(fù)制了一遍。2Java的clone()方法clone方法將對象復(fù)制了一份并返回給調(diào)用者。一般而言,clone()方法滿足:對任何的對象x,都有x.clone(
2、) !=x/克隆對象與原對象不是同一個對象對任何的對象x,都有x.clone().getClass()= =x.getClass()/克隆對象與原對象的類型一樣假如對象x的equals()方法定義恰當,那么x.clone().equals(x)應(yīng)當成立。Java中對象的克隆為了獵取對象的一份拷貝,我們可以利用Object類的clone()方法。在派生類中掩蓋基類的clone()方法,并聲明為public。在派生類的clone()方法中,調(diào)用super.clone()。在派生類中實現(xiàn)Cloneable接口。請看如下代碼: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()識別出你要復(fù)制的是哪一個對象。 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. 說明:為什么我們在派生類中掩蓋Object的clone()方法時,肯定要調(diào)用super.clone()呢?在運行時刻,Object中的 clone() 識別出你要復(fù)制的是哪一個對象,然后為此對象安排空間,并進行對象的復(fù)制,將原始
8、對象的內(nèi)容一一復(fù)制到新對象的存儲空間中。繼承自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;/ 常量對象。 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)當如何實現(xiàn)深層次的克隆,即修改s2的教授不會影響s1的教授?代碼改進如下。改進使同學(xué)1的Prof
15、essor不轉(zhuǎn)變(深層次的克?。?. 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. /對引用的對象也進行復(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利用串行化來做深復(fù)制(主要是為了避開重寫比較簡單對象的深復(fù)制的clone()方法,也可以程序?qū)崿F(xiàn)斷點續(xù)傳等等功能)把對象寫到流里的過程是串行化(Serilization)過程,但是在Java程序師圈子里又格外形象地稱為“冷凍”或者“腌咸菜 (picking)” 過程;而把對象從流中讀出來的并行化(Deserialization)過程則叫做 “解凍”或者“回鮮(depicking)”過程。應(yīng)
24、當指出的是,寫在流里的是對象的一個拷貝,而原對象仍舊存在于JVM里面,因此“腌成咸菜”的只是對象的一個拷貝,Java咸菜還可以回鮮。在Java語言里深復(fù)制一個對象,經(jīng)??梢韵仁箤ο髮崿F(xiàn)Serializable接口,然后把對象(實際上只是對象的一個拷貝)寫到一個流里(腌成咸菜),再從流里讀出來(把咸菜回鮮),便可以重建對象。如下為深復(fù)制源代碼。1. public Object deepClone() 2. 3. /將對象寫到流里 4. ByteArrayOutoutStream bo=new ByteArrayOutputS
25、tream(); 5. ObjectOutputStream oo=new ObjectOutputStream(bo); 6. oo.writeObject(this); 7. /從流里讀出來 8. ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray(); 9. ObjectInputStream oi=new ObjectInputStream(bi); 10. return(oi.readObj
26、ect(); 11. 這樣做的前提是對象以及對象內(nèi)部全部引用到的對象都是可串行化的,否則,就需要認真考察那些不行串行化的對象或?qū)傩钥煞裨O(shè)成transient,從而將之排解在復(fù)制過程之外。上例代碼改進如下。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;/常量對象 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/將對象寫到流里 20. ByteArrayOutoutStream bo=new ByteArrayOu
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年二手車買賣合同協(xié)議
- 房產(chǎn)證購房合同格式
- 新式勞務(wù)合同范例模板
- 2024裝修工程結(jié)算協(xié)議
- 出租車公司車輛轉(zhuǎn)讓合同樣本
- 股權(quán)激勵合同范本
- 技術(shù)開發(fā)保密合同樣本
- 小區(qū)環(huán)境整治施工合同
- 就業(yè)安置協(xié)議書撰寫心得
- 合伙協(xié)議退出機制詳解
- 玻璃幕墻工程施工質(zhì)量控制方法與措施
- 慢性淋巴細胞白血病-課件
- 銷售逼單成交話術(shù)及技巧
- 《影響人類文明的里程碑》課件
- 《針織學(xué)》期末考試試卷附答案
- 風電場地質(zhì)勘察設(shè)計方案
- 橫河UT35A-32A-操作手冊
- 計算機網(wǎng)絡(luò)(第三版)課件(完整版)
- 《紅樓夢》指導(dǎo)第二課 命名
- 關(guān)于建立企業(yè)干部職工末等調(diào)整和不勝任退出機制的實施方案
- 水利工程工程量清單計價解讀講解課件
評論
0/150
提交評論