关于java中的深copy与浅copy的有关问题
关于java中的深copy与浅copy的问题
前几天老师让同学们讲一讲设计模式中的原型模式,主要是涉及到了java中的深copy与浅copy的问题.很多同学都没搞清楚,所以今天我做了一个总结:
首先写一个daugter类,在下面作为Teacher的一个对象:
package com.zhaole; import java.io.Serializable; public class Daugter implements Serializable{ public String name="asdf"; }
然后写个Teacher类,分别实现Serializable,Cloneable接口。
package com.zhaole; import java.io.Serializable; public class Teacher implements Serializable,Cloneable { public String name="lele"; Daugter da=new Daugter(); @Override public Object clone() throws CloneNotSupportedException { // TODO Auto-generated method stub return super.clone(); } }
写一个测试类:
package com.zhaole; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class Test { Teacher t=new Teacher(); public static Teacher copy(Teacher t){ Teacher ob=null; try { ByteArrayOutputStream baos=new ByteArrayOutputStream(); ObjectOutputStream oos=new ObjectOutputStream(baos); oos.writeObject(t); oos.flush(); oos.close(); ByteArrayInputStream bais=new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois=new ObjectInputStream(bais); ob=(Teacher)ois.readObject(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ob; } public static void main(String[] args){ Test s=new Test(); Teacher t=new Teacher(); System.out.println("<<<<<<<<<<<<<<<<<浅copy>>>>>>>>>>>>>>>"); try { Teacher b=(Teacher)t.clone(); if(b!=t){ System.out.println("不是同一个对象"); if(b.da==t.da){ System.out.println("<<<<<<<<<<<<<<下一层>>>>>>>>>>>"); System.out.println("是同一个对象"); }else{ System.out.println("<<<<<<<<<<<<<<下一层>>>>>>>>>>>"); System.out.println("不是同一个对象"); } }else{ System.out.println("是同一个对象"); if(b.da==t.da){ System.out.println("<<<<<<<<<<<<<<下一层>>>>>>>>>>>"); System.out.println("是同一个对象"); }else{ System.out.println("<<<<<<<<<<<<<<下一层>>>>>>>>>>>"); System.out.println("不是同一个对象"); } } } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("<<<<<<<<<<<<深copy>>>>>>>>>>>>>>>>"); if(t==Test.copy(t)){ System.out.println("是同一个对象"); if(t.da==Test.copy(t).da){ System.out.println("<<<<<<<<<<<下一层 了>>>>>>>>>>>>>>>"); System.out.println("是同一个对象"); } else{ System.out.println("<<<<<<<<<<<下一层 了>>>>>>>>>>>>>>>"); System.out.println("不是同一个对象"); } } else{ System.out.println("不是同一个对象了"); if(t.da==Test.copy(t).da){ System.out.println("<<<<<<<<<<<下一层 了>>>>>>>>>>>>>>>"); System.out.println("是同一个对象"); }else{ System.out.println("<<<<<<<<<<<下一层 了>>>>>>>>>>>>>>>"); System.out.println("不是同一个对象"); } } } }
测试结果:
<<<<<<<<<<<<<<<<<浅copy>>>>>>>>>>>>>>> 不是同一个对象 <<<<<<<<<<<<<<下一层>>>>>>>>>>> 是同一个对象 <<<<<<<<<<<<深copy>>>>>>>>>>>>>>>> 不是同一个对象了 <<<<<<<<<<<下一层 了>>>>>>>>>>>>>>> 不是同一个对象
总结:
从上面的结果可以明显得出这样一个结论,java中的浅copy,也就是用clone方法实现的,只是复制了个当前实例,但是对实例中的各个对象并没有实现复制,只是获得了对该实例中的对象的引用。而深复制不仅仅实现了对当前实例的复制,并且还把实例中的所有对象都逐一进行复制。
1 楼
Technoboy
2011-05-10
http://technoboy.iteye.com/blog/1032533