我们有的时候在给一个对象赋值另一个对象,要实现的功能是在对后一个对象做修改或其他操作对原有对象没有影响的功能。这种情况我们就要做深拷贝。
现在我写一个实体代码:
public class People implements Cloneable { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Object clone() throws CloneNotSupportedException { People p = (People) super.clone(); return p; } }
然后我用一个测试类来讲解深拷贝和浅拷贝的区别:
浅拷贝:
public class objecttest { public static void main(String [] arg){ People p=new People(); p.setName("ss"); p.setAge(22); People pp=new People(); pp=p; pp.setName("aa"); pp.setAge(33); System.out.println(p.getName()); System.out.println(pp.getName()); } }看一下运行结果:
这就是浅拷贝:说白了就是在创建一个People对象把它赋值给p,让变量p存储的是创建的People对象的地址。在创建一个People对象将他辅助给pp变量,然后让pp变量存储新创建的People对象的地址,然后在将p变量存储的指向原先创建的People地址赋值给pp。这样就覆盖了后pp的指向,是pp指向了原先创建的地址空间。导致p和pp都是指向的原先创建的People对象的地址。在修改pp对象时我们也将p指向的对象修改了。
深拷贝:
public class objecttest { public static void main(String [] arg){ People p=new People(); p.setName("ss"); p.setAge(22); People pp=new People(); try { pp=(People) p.clone(); pp.setName("aa"); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(p.getName()); System.out.println(pp.getName()); } }运行后的结果:
深拷贝就是将p指向的对象每一个属性和方法都拷贝到pp指向的对象中,就像copy了一份,使对pp对象进行修改或其他操作对原有的p对象没有影响。