A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© laiminghui 高级黑马   /  2013-8-31 16:12  /  1218 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 laiminghui 于 2013-9-1 09:01 编辑

     


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


要比较详细的  


  谢谢

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

4 个回复

倒序浏览

回帖奖励 +6

浅复制(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;
    }
}

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
java中有一个对象池,当执行A a1 = new A()时,会在对象池中生成一个A的对象,并把这个对象的引用给a1;
浅拷贝就是如A a2 = a1,这时候对象池中只有一个A对象,只不过这个对象多了个a2的引用,此时a1和a2指向的是同一个对象;
深拷贝就是在对象池中再生成一个A对象给a2,这个A对象跟a1指向的A对象内容、引用等都一样,但此时a1和a2指向的是不同的两个对象。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
月黑风高 发表于 2013-8-31 16:24
浅复制(shallow clone):
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然 ...

thank  you  
回复 使用道具 举报
黑马-文鸿利 发表于 2013-8-31 18:35
java中有一个对象池,当执行A a1 = new A()时,会在对象池中生成一个A的对象,并把这个对象的引用给a1;
浅 ...

thank  you
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马