java 深拷贝与浅拷贝

文章通过两个示例探讨了Java中字符串和对象引用的概念。首先,展示了试图通过反射修改String对象值的操作,指出由于String的不可变性,实际结果并不如预期。接着,通过一个User类和List的例子说明了对象引用的问题,当对列表中的对象进行修改时,会影响到原始对象。为解决此问题,文章介绍了实现Cloneable接口并重写clone方法来创建对象副本的方法。
摘要由CSDN通过智能技术生成
 String a = "abc";

        String b ="abc";
        //反射abc
        Field[] declaredFields = "abc".getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            //修改abc的值
            if (field.getName().equals("value")) {
                try {
                    field.setAccessible(true);
                    //改位eeee 因为jdk1.8String 内部是Char类型
                    field.set(a, "eeee".toCharArray());
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println(a);
        System.out.println(b);

先看这个代码 声明了两个String 值为abc ,然后把abc修改为eee 那么她的答案是多少了?

很多人一看看上去 觉得a改成eeee  ,b还是 abc 

正确答案都是eee 在举一个例子

        List<User> list = new LinkedList<User>();
        User caoCao = new User();
        caoCao.setName("曹操");
        list.add(caoCao);
        User liuBei = list.get(0);
        liuBei.setName("刘备");
        System.out.println(caoCao.getName());

 声明一个user 其名字为曹操,并把他添加到List集合里后,获取list集合第一个并对齐进行修改为刘备 那么他的结果是刘备还是曹操?

 答案是刘备,那为什么什么刘备了,我这里并没有修改曹操的对象,这是为什么了,其实是他们的引用地址是相同的。

    List<User> list = new LinkedList<User>();
        User caoCao = new User();
        caoCao.setName("曹操");
        list.add(caoCao);
        User liuBei = list.get(0);
        liuBei.setName("刘备");
        System.out.println(caoCao.getName());

        System.out.println(liuBei);
        System.out.println(caoCao);

如果要解决这个问题不让他引用对象一样那么我们需要 使用这个接口

Cloneable并重写Clone 方法也就是把protected改为public
public class User implements Cloneable{
    private Long id;

    private String name;

    private String account;

    private String password;

    public Integer getAvg() {
        return avg;
    }

    public void setAvg(Integer avg) {
        this.avg = avg;
    }

    private String sex;
    public User(){

    }
    public User(Long id, String name, String account, String password, String sex, Integer avg) {
        this.id = id;
        this.name = name;
        this.account = account;
        this.password = password;
        this.sex = sex;
        this.avg = avg;
    }

    private Integer avg;
    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public User(Long id, String name, String account, String password, String sex) {
        this.id = id;
        this.name = name;
        this.account = account;
        this.password = password;
        this.sex = sex;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
   List<User> list = new LinkedList<User>();
        User caoCao = new User();
        caoCao.setName("曹操");
        list.add(caoCao);
        User liuBei = null;
        try {
            liuBei = (User)list.get(0).clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        liuBei.setName("刘备");
        System.out.println(liuBei.getName());
        System.out.println(caoCao.getName());

        System.out.println(liuBei);
        System.out.println(caoCao);

结果 这次他们内部的引用地址是不相同的

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值