我們已經知道,一個類別的兩個物件如果具有相同的引用,那麼它們就具有相同的實體和功能,例如:
Aone=newA();Atwo=one;
假設A類有名字為x的int型成員變量,那麼,如果進行如下操作:
two.x=100;
那麼one.x的值也會是100。
再例如,某個方法的參數是People型別:
publicvoidf(Peoplep){px=200;}
如果呼叫該方法時,將People的某個物件的引用,例如zhang,傳遞給參數P,那麼該方法執行後,zhang.x的值也會是200。
有時想得到物件的一個“複製品”,複製品實體的變化不會引起原始物件實體變化,反之亦然。這樣的複製品稱為原物件的一個克隆物件或簡稱克隆。
使用物件流很容易取得一個序列化物件的克隆,只需將該物件寫入物件輸出流指向的目的地,然後將該目的地作為一個物件輸入流的來源,那麼該物件輸入流從來源中讀回的物件一定是原始物件的一個克隆,即物件輸入流透過物件的序列化資訊來得到當前物件的一個克隆。例如,上節範例中的物件xinfei就是物件changhong的一個克隆。
當程式想以較快的速度得到一個物件的克隆時,可以用物件流將物件的序列化資訊寫入內存,而不是寫入到磁碟的檔案中。物件流將數組流作為底層流就可以將物件的序列化資訊寫入記憶體。例如,我們可以將上節範例中的
FileOutputStreamfileOut=newFileOutputStream(file);ObjectOutputStreamobjectOut=newObjectOutputStream(fileOut);
和
FileInputStreamfileIn=newFileInputStream(file);ObjectInputStreamobjectIn=newObjectInputStream(fileIn);
分別改為:
ByteArrayOutputStreamoutByte=newByteArrayOutputStream();ObjectOutputStreamobjectOut=newObjectOutputStream(outByte);
和
ByteArrayInputStreaminByte=newByteArrayInputStream(outByte.toByteArray());ObjectInputStreamobjectIn=newObjectInputStream(inByte);
java.awt套件中的Component類別是實作Serializable介面的類,元件是序列化對象,因此,程式可以把元件寫入輸出流,然後再用輸入流讀入該元件的複製。