日期:2014-05-20  浏览次数:20886 次

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