栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

clone()方法深拷贝与浅拷贝

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

clone()方法深拷贝与浅拷贝

JAVA中除了8种基本类型传参数是值传递外,其他的类对象传参数都是引用,如果直接使用clone()方法,只能完成对象的浅拷贝,若想实现深拷贝,则要重写clone()方法。

一,浅拷贝
class Employee implements Cloneable{
    private int age ;
    private String name;
    private Date date;

    public Employee(int age, String name, Date date) {
        this.name = name;
        this.age = age;
        this.date = date;
    }
    
    public int getAge() {
        return age;
    }
    
    public String getName() {
        return name;
    }
    
    public Date getDate() {
        return date;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

类 Employee 有三个属性,其中只有 age 是基本类型。clone() 方法是调用了父类的实现,并未重写。验证一下现在的 clone() 方法是否为浅拷贝。(注意:要使用 clone() 方法就必须实现 Cloneable 标记接口)

public class Test {

    public static void main(String[] args) throws CloneNotSupportedException {

        Employee e1 = new Employee(15,"小明",new Date());
        Employee e2 = (Employee) e1.clone();

        System.out.println(e1==e2);
        System.out.println(e1.getAge()==e2.getAge());
        System.out.println(e1.getName()==e2.getName());
        System.out.println(e1.getDate()==e2.getDate());

    }
}

结果:

解释:
1,因为使用 clone() 方式时会给新的对象分配一个新的内存,而“==”在比较引用类型对象时看的是两个变量指向的对象在内存中存储的地址是否相等,所以结果为 false。

2,对基本数据类型(如int,double),使用“==”比较的是两个变量存储的值是否相等而非两个变量是否指向同一内存地址,所以结果为true。

3,String 和 Date 都是引用数据类型,对于这种数据类型,使用“==”时比较的是两个变量是否指向同一内存地址,结果为 true,说明对象 e2 的 name 属性和对象 e1 的 name 属性指向同一个内存地址,一个变化了另一个也会随之变化,date 属性也是同样的情况。这就是浅拷贝,如图:

二,深拷贝

实现深拷贝需要重写 clone() 方法:

class Employee implements Cloneable{
    private int age ;
    private String name;
    private Date date;

    public Employee(int age, String name, Date date) {
        this.name = name;
        this.age = age;
        this.date = date;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public Date getDate() {
        return date;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {

        Employee cloned = (Employee) super.clone();
        cloned.name = new String(name);
        cloned.date = (Date) date.clone();
        return cloned;
    }
}

验证是否为深拷贝:

public class Test {

    public static void main(String[] args) throws CloneNotSupportedException {

        Employee e1 = new Employee(15,"小明",new Date());
        Employee e2 = (Employee) e1.clone();

        System.out.println(e1==e2);
        System.out.println(e1.getAge()==e2.getAge());
        System.out.println(e1.getName()==e2.getName());
        System.out.println(e1.getDate()==e2.getDate());

    }
}

结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/697148.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号