深复制和浅复制

来源:互联网 发布:北旅之星淘宝店 编辑:程序博客网 时间:2024/05/09 06:47

在程序设计的过程中难免需要用到程序的副本,也就是说我需要这个对象并且要改变对象的现有状态但是又想保留原来对象的状态。这时候我们就要使用对象的副本,当然这种情况只存在于对象。对于int,float.double以及对象中的String我们都可以声明一个然后使用赋值得方法就能得到对象的副本。但是对于真正的对象,使用=进行操作其实得到的引用,也就是=两端的指向的是相同的内存地址,所以操作其中任何一个都会改变多有。在这种情况下我们可以使用克隆的方法。即clone()这个方法可以使你得到一个对象的副本。也要付出相应的代价就是需要实现clonable接口。然后实现这个借口中的方法clone()这样就可以得到你想要得对象的副本了。如:
class TestClone implements Clonalbe{
 private String filed1;
private String filed2;
public TestClone(String name1,String name2){
      filed1 = name1;
      filed2 = name2;
}
public Object clone(){
 TestClone temp = null;
   try{
     temp = (TestClone) super.clone();
 }catch(CloneNotSupportException e){
    System.out.println(“Clone faild“);
}
 return temp;
}
}
}
但是这种方法只能克隆出基本的类型如果对象的属性中还有对象的话需要在clone方法中加以实现,这就比较麻烦了,因为我们不知道这样一层一层迭代下去的究竟有多少层对象,要做多少处理。引用了新的方法,就是使用串行化的方法,串行化过程其实是把对象的副本进行了串行化,这样我们只要把一个对象串行化然后再去出来就可以实现克隆了,而且里面的所有内容全部被克隆了。串行化的过程需要实现一个Serializable接口,这样才能支持串行化。比如:
Class TestSerial implements Serializable{
  private TestClone cloneObject = new TestClone(“1“,“3“);
  private String test = “343434“;
 public static void main(String[] args){
    TestSerial t1 = new TestSerial();
    ByteArrayOutputStream bo = new ByteArrayOutputStream();
    ObjectOutputStream objectOut = new ObjectOutputStream(bo);
    objectOut.writeObject(t1);
    ObjectIutputStream  in = new ObjectInputStream(new ByteArrayInputStream(bo.toByteArray()));
   TestSerial t2 = (TestSerial) in.readObject();
}
}
如果要某个类具有深复制的功能只要把上面main中的代码修改一下写一个方法就可以了。
clone只是复制基本元素所以是浅复制,而使用Serializable接口实现的可以完全复制的称之为深复制。

上面对深复制和浅复制进行了简单的介绍,希望对大家能够有所帮助。

原创粉丝点击