java中方法与方法之间调用的时候所传递的参数大致分为两种,一种是java基本数据类型(如String、int、char等,以及其对应的包装类),另外一种是复杂数据类型(即我们自己定义的类)。这两种类型的参数对于clone出来的新对象来说存在着以下差异。

浅复制:基本数据类型属于值传递,也就是说如果针对克隆源修改基本数据类型的属性,将不会影响克隆体。而复杂数据类型属于引用传递,对于已经克隆出来的新对象,如果克隆源的复杂数据类型属性发生改变,那么克隆体的该属性也跟着一起改变。

如果想将复杂数据类型也变成值传递的话,就需要使用深复制。是想方法如下:


/**
      * 深复制
      * @throws IOException 
      * @throws ClassNotFoundException 
      */
     public Object deepClone() throws IOException, ClassNotFoundException{
         //写入当前对象的二进制流
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ObjectOutputStream oos = new ObjectOutputStream(bos);
         oos.writeObject(this);
         
         //读出二进制流产生的新对象
         ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
         ObjectInputStream ois = new ObjectInputStream(bis);
         return ois.readObject();
     }