我们已经知道,一个类的两个对象如果具有相同的引用,那么它们就具有相同的实体和功能,比如:
A one = new A(); A two = one;
假设A类有名字为x的int型成员变量,那么,如果进行如下操作:
two.x = 100;
那么one.x的值也会是100。
再比如,某个方法的参数是People类型:
public void f(People p) { p.x = 200; }
如果调用该方法时,将People的某个对象的引用,比如zhang,传递给参数P,那么该方法执行后,zhang.x的值也将是200。
有时想得到对象的一个“复制品”,复制品实体的变化不会引起原对象实体发生变化,反之亦然。这样的复制品称为原对象的一个克隆对象或简称克隆。
使用对象流很容易获取一个序列化对象的克隆,只需将该对象写入对象输出流指向的目的地,然后将该目的地作为一个对象输入流的源,那么该对象输入流从源中读回的对象一定是原对象的一个克隆,即对象输入流通过对象的序列化信息来得到当前对象的一个克隆。例如,上节例子中的对象xinfei就是对象changhong的一个克隆。
当程序想以较快的速度得到一个对象的克隆时,可以用对象流将对象的序列化信息写入内存,而不是写入到磁盘的文件中。对象流将数组流作为底层流就可以将对象的序列化信息写入内存。例如,我们可以将上节例子中的
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类是实现Serializable接口的类,组件是序列化对象,因此,程序可以把组件写入输出流,然后再用输入流读入该组件的克隆。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程