Java中對象的深復(fù)制和淺復(fù)制詳解_第1頁
Java中對象的深復(fù)制和淺復(fù)制詳解_第2頁
Java中對象的深復(fù)制和淺復(fù)制詳解_第3頁
Java中對象的深復(fù)制和淺復(fù)制詳解_第4頁
Java中對象的深復(fù)制和淺復(fù)制詳解_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論