黑马程序员技术交流社区

标题: 浅复制VS深复制 [打印本页]

作者: laiminghui    时间: 2013-8-31 16:12
标题: 浅复制VS深复制
本帖最后由 laiminghui 于 2013-9-1 09:01 编辑

     


  谁来帮我 理清楚 浅复制和深复制之间的区别和联系  


要比较详细的  


  谢谢

作者: 月黑风高    时间: 2013-8-31 16:24
浅复制(shallow clone):
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。也就是说,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。继承自java.lang.Object类的clone()方法是浅复制。

深复制(deep clone):
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。意思也就是,深复制把要复制的对象所引用的对象都复制了一遍。

//创建Employee类,实现Cloneable接口,重写clone方法,实现深复制:
class Employee implements Cloneable{
    private String username;
    private Employer employer;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Employer getEmployer() {
        return employer;
    }
    public void setEmployer(Employer employer) {
        this.employer = employer;
    }
    @Override
    public Object clone() throws CloneNotSupportedException {
        //手动克隆Employee对象中包含的Employer对象
        Employee employee = (Employee)super.clone();
        employee.setEmployer((Employer) employee.getEmployer().clone());
        return employee;
    }
}

作者: 黑马-文鸿利    时间: 2013-8-31 18:35
java中有一个对象池,当执行A a1 = new A()时,会在对象池中生成一个A的对象,并把这个对象的引用给a1;
浅拷贝就是如A a2 = a1,这时候对象池中只有一个A对象,只不过这个对象多了个a2的引用,此时a1和a2指向的是同一个对象;
深拷贝就是在对象池中再生成一个A对象给a2,这个A对象跟a1指向的A对象内容、引用等都一样,但此时a1和a2指向的是不同的两个对象。
作者: laiminghui    时间: 2013-8-31 19:56
月黑风高 发表于 2013-8-31 16:24
浅复制(shallow clone):
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然 ...

thank  you  

作者: laiminghui    时间: 2013-8-31 19:57
黑马-文鸿利 发表于 2013-8-31 18:35
java中有一个对象池,当执行A a1 = new A()时,会在对象池中生成一个A的对象,并把这个对象的引用给a1;
浅 ...

thank  you





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2