我们已经知道,一个类的两个对象如果具有相同的引用,那么它们就具有相同的实体和功能,比如:
Aone=newA();Atwo=one;
假设A类有名字为x的int型成员变量,那么,如果进行如下操作:
two.x=100;
那么one.x的值也会是100。
再比如,某个方法的参数是People类型:
publicvoidf(Peoplep){p.x=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接口的类,组件是序列化对象,因此,程序可以把组件写入输出流,然后再用输入流读入该组件的克隆。