JAVA深復(fù)制與淺復(fù)制(淺克隆)_第1頁
JAVA深復(fù)制與淺復(fù)制(淺克隆)_第2頁
JAVA深復(fù)制與淺復(fù)制(淺克隆)_第3頁
JAVA深復(fù)制與淺復(fù)制(淺克隆)_第4頁
JAVA深復(fù)制與淺復(fù)制(淺克隆)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論