我們已經(jīng)知道,一個類的兩個對象如果具有相同的引用,那么它們就具有相同的實體和功能,比如:
A one = new A(); A two = one;
假設(shè)A類有名字為x的int型成員變量,那么,如果進行如下操作:
two.x = 100;
那么one.x的值也會是100。
再比如,某個方法的參數(shù)是People類型:
public void f(People p) { p.x = 200; }
如果調(diào)用該方法時,將People的某個對象的引用,比如zhang,傳遞給參數(shù)P,那么該方法執(zhí)行后,zhang.x的值也將是200。
有時想得到對象的一個“復(fù)制品”,復(fù)制品實體的變化不會引起原對象實體發(fā)生變化,反之亦然。這樣的復(fù)制品稱為原對象的一個克隆對象或簡稱克隆。
使用對象流很容易獲取一個序列化對象的克隆,只需將該對象寫入對象輸出流指向的目的地,然后將該目的地作為一個對象輸入流的源,那么該對象輸入流從源中讀回的對象一定是原對象的一個克隆,即對象輸入流通過對象的序列化信息來得到當(dāng)前對象的一個克隆。例如,上節(jié)例子中的對象xinfei就是對象changhong的一個克隆。
當(dāng)程序想以較快的速度得到一個對象的克隆時,可以用對象流將對象的序列化信息寫入內(nèi)存,而不是寫入到磁盤的文件中。對象流將數(shù)組流作為底層流就可以將對象的序列化信息寫入內(nèi)存。例如,我們可以將上節(jié)例子中的
FileOutputStream fileOut = new FileOutputStream(file); ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
和
FileInputStream fileIn = new FileInputStream(file); ObjectInputStream objectIn = new ObjectInputStream(fileIn);
分別更改為:
ByteArrayOutputStream outByte = new ByteArrayOutputStream(); ObjectOutputStream objectOut = new ObjectOutputStream(outByte);
和
ByteArrayInputStream inByte = new ByteArrayInputStream(outByte.toByteArray()); ObjectInputStream objectIn = new ObjectInputStream(inByte);
java.awt包中的Component類是實現(xiàn)Serializable接口的類,組件是序列化對象,因此,程序可以把組件寫入輸出流,然后再用輸入流讀入該組件的克隆。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導(dǎo)課程