java基础之 深拷贝、浅拷贝

克隆创建对象

1、实现 Cloneable 接口
2、调用 clone() 方法

浅拷贝

  • 拷贝的只是引用
  • 堆中只有一个实例
  • 栈中多了一个拷贝的引用
  • 改变原有对象的属性, 拷贝对象也会变
public class Test {
    /**
     * 原型模式。 就是能够对之前的对象进行克隆, 然后产生一个新的对象
     * 浅克隆
     * 1、实现 cloneenble 接口
     * 2、重写 clone方法
     *
     * @param args
     */
    public static void main(String[] args) throws CloneNotSupportedException {
        test();
    }

    @SuppressWarnings("all")
    static void test() throws CloneNotSupportedException {
        // 1、新建原型对象
        Date date = new Date();
        user u1 = new user(1, "cyt", date);
        user u2 = (user) u1.clone();

        System.out.println("u1->" + u1);
        System.out.println("u1.hashcode->" + u1.hashCode());
        System.out.println("u2->" + u2);
        System.out.println("u2.hashcode->" + u2.hashCode());
        System.out.println("========================");
        date.setTime(132456);
        System.out.println("u1->" + u1);
        System.out.println("u2->" + u2);
        /**
         * 重新设置原型的属性, clone 对象的值也会改变
         *u1->user{id=1, name='cyt', date=Thu Apr 23 16:41:19 CST 2020}
         * u1.hashcode->1807837413
         * u2->user{id=1, name='cyt', date=Thu Apr 23 16:41:19 CST 2020}
         * u2.hashcode->1254526270
         * ========================
         * u1->user{id=1, name='cyt', date=Thu Jan 01 08:02:12 CST 1970}
         * u2->user{id=1, name='cyt', date=Thu Jan 01 08:02:12 CST 1970}
         */
    }
}

深拷贝

  • 改变原有对象的属性, 拷贝对象不会变
public class Test {

    /**
     * 深克隆
     * 1、实现 cloneenble 接口
     * 2、重写 clone方法, 并修改, 外加克隆属性
     *
     * @param args
     */
    public static void main(String[] args) throws CloneNotSupportedException {
        test();
    }

    @SuppressWarnings("all")
    static void test() throws CloneNotSupportedException {
        // 1、新建原型对象
        Date date = new Date();
        user u1 = new user(1, "cyt", date);
        user u2 = (user) u1.clone();

        System.out.println("u1->" + u1);
        System.out.println("u1.hashcode->" + u1.hashCode());
        System.out.println("u2->" + u2);
        System.out.println("u2.hashcode->" + u2.hashCode());


        System.out.println("========================");
        date.setTime(132456);

        System.out.println("u1->" + u1);
        System.out.println("u2->" + u2);

        /**
         * 重新设置原型的属性, clone 对象的值不会改变
         u1->user{id=1, name='cyt', date=Thu Apr 23 16:46:17 CST 2020}
         u1.hashcode->1807837413
         u2->user{id=1, name='cyt', date=Thu Apr 23 16:46:17 CST 2020}
         u2.hashcode->1254526270
         ========================
         u1->user{id=1, name='cyt', date=Thu Jan 01 08:02:12 CST 1970}
         u2->user{id=1, name='cyt', date=Thu Apr 23 16:46:17 CST 2020}
         */
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值