java对象---深/浅拷贝

继原型模式的续,本文分享的是浅拷贝和深拷贝
深入了解浅拷贝与深拷贝

在学习深拷贝和浅拷贝之前,咱们先来一个例子;

  1. import java.util.ArrayList;

  2. public class MyBaby implements Cloneable {

  3.    /**

  4.     * 私有变量

  5.     */

  6.    private ArrayList<String> list = new ArrayList<>();

  7.    @Override

  8.    protected Object clone() throws CloneNotSupportedException {

  9.        MyBaby myBaby = null;

  10.        try {

  11.            myBaby = (MyBaby) super.clone();

  12.       } catch (CloneNotSupportedException ex) {

  13.            ex.printStackTrace();

  14.       }

  15.        return myBaby;

  16.   }

  17.    /**

  18.     * 给List设置

  19.     *

  20.     * @param value 值

  21.     */

  22.    public void setValue(String value) {

  23.        this.list.add(value);

  24.   }

  25.    /**

  26.     * 获取list

  27.     *

  28.     * @return list

  29.     */

  30.    public ArrayList<String> getValue() {

  31.        return this.list;

  32.   }

  33. }

在MyBaby类中有一个私有变量list,类似为List,然后咱们使用setValue对其进行设值,使用getValue进行取值。接下来咱们来看看他是如何拷贝的。

  1. public class TestMyBaby {

  2.    public static void main(String[] args) {

  3.        MyBaby baby = new MyBaby();

  4.        baby.setValue("Java后端技术栈");

  5.        try {

  6.            MyBaby myBabyClone = (MyBaby) baby.clone();

  7.            myBabyClone.setValue("咖啡");

  8.            

  9.            System.out.println(baby.getValue());

  10.       } catch (CloneNotSupportedException e) {

  11.            e.printStackTrace();

  12.       }

  13.   }

  14. }

猜想运行结果会是神马?

[Java后端技术栈, 咖啡]

怎么会这样呢?怎么会有“咖啡”呢?

是因为Java给我们做了一个偷懒性的拷贝动作,Object类原本就提供一个方法clone用来拷贝对象,因为其对象内部的数组、引用对象等都不拷贝,还是指向了原生对象的内部元素地址,这种拷贝就叫做浅拷贝

浅拷贝

上面这个拷贝也太浅了吧,两个对象引用都boby、myBaby共享一个私有变量list,都可以对list进行改变,是一种非常不安全的方式。

再看一个例子;

  1. public class Person implements Cloneable {

  2.    private int age;

  3.    private String name;

  4.    public int getAge() {

  5.        return age;

  6.   }

  7.    public void setAge(int age) {

  8.        this.age = age;

  9.   }

  10.    public String getName() {

  11.        return name;

  12.   }

  13.    public void setName(String name) {

  14.        this.name = name;

  15.   }

  16.    @Override

  17.    protected Object clone() throws CloneNotSupportedException {

  18.        Person person=null;

  19.        try{

  20.            person=(Person)super.clone();

  21.       }catch (CloneNotSupportedException ex){

  22.            ex.printStackTrace();

  23.       }

  24.        return person;

  25.   }

  26. }

。。。。。。。。。。。。。。。。。

版权原因,完整文章,请参考如下:java对象---深/浅拷贝

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值