java中对象输入输出流中克隆的实现过程
import java.io.*;
import java.util.*;
class Student implements Serializable
{ String name=null;
double height;
Alt object;
Student(String name,double height)
{ this.name=name;
this.height=height;
}
public void setHeight(double c)
{ this.height=c;
}
public void setObject(Alt object)
{ this.object=object;
}
}
public class ObjectStreamExa
{
public static void main(String[] arg)
{ Student zhang=new Student("张三",1.65);
Alt object=new Alt(11,"good");
zhang.setObject(object);
try
{ File f=new File("G://java code/jackxu/src","good.txt");
FileOutputStream file=new FileOutputStream(f);
ObjectOutputStream object_out=new ObjectOutputStream(file);
object_out.writeObject(zhang);
object_out.close();
FileInputStream file_in=new FileInputStream(f);
ObjectInputStream object_in=new ObjectInputStream(file_in);
Student li=(Student)object_in.readObject();
Alt objec=new Alt(12,"god");
li.setObject(objec);
li.setHeight(1.78);
li.name="李四";
System.out.println(zhang.name+"身高是: "+zhang.height);
System.out.println(li.name+"身高是: "+li.height);
System.out.println(zhang.object.a);
}
catch(
ClassNotFoundException event)
{ System.out.println("不能读出对象");
}
catch(
IOException event)
{ System.out.println("can not read file"+event);
}
}
}
class Alt implements Serializable
{ int a;
String keyname;
Alt(int a,String keyname)
{ this.a=a;
this.keyname=keyname;
}
}
上面的程序是对象输入输出流中。写入到目的地good.txt有一个引用变量Alt object,因为对象输入输出流实现了克隆接口,读取的输入流对象Student li是一个克隆对象,它改变了原类中的引用变量Alt object,则当克隆对象改变原对象中基本数据类型成员变量时,输出zhang.name,zhang.height应该是是克隆对象重新赋的值,而不是初始值"张三",1.65。
这儿的zhang.height输出是1.65,不是1.78,不符合深度克隆的情况,这是怎么回事?
------解决方案--------------------
深克隆是对象的一份拷贝,对象中的对象也需要克隆。克隆对象与原对象是两份。
改变克隆对象不会影响原对象,这也是深克隆的原意,所以程序没问题,zhang的输出是zhang,lisi的输出是lisi