文档章节

Java Clone

拿客-三产
 拿客-三产
发布于 2017/03/24 13:24
字数 483
阅读 7
收藏 0

Java类自带了本地的clone()方法,该方法会返回现有实例的副本。如果要使用Java克隆,必须实现java.lang.Cloneable接口,以便它不会在运行时抛出CloneNotSupportedException。 如果clone()函数会返回对象副本,那么在什么情况下我们需要重写它? 让我们运行下面的java类来更好的理解。

import java.util.HashMap;
import java.util.Iterator;

/**
 * @author 三产
 * @version 1.0
 * @date 2017-03-21
 * @QQGroup 213732117
 * @website http://www.coderknock.com
 * @copyright Copyright 2017 拿客 coderknock.com  All rights reserved.
 * @since JDK 1.8
 */
public class Clone implements Cloneable {
    private int id;

    private String name;

    private HashMap<String, String> props;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public HashMap getProps() {
        return props;
    }

    public void setProps(HashMap props) {
        this.props = props;
    }
   
    public static void main(String[] args) throws CloneNotSupportedException {
        Clone ct1 = new Clone();
        ct1.setId(1);
        ct1.setName("first");
        HashMap hm = new HashMap();
        hm.put("1", "first");
        hm.put("2", "second");
        hm.put("3", "third");
        ct1.setProps(hm);
        // Using default clone() implementation
        Clone ct2 = (Clone) ct1.clone();
        // Check whether the ct1 and ct2 attributes are same or different
        System.out.println("ct1 and ct2 HashMap == test: "
                + (ct1.getProps() == ct2.getProps()));
        // Lets see the effect of using default cloning
        ct1.getProps().put("4", "fourth");
        System.out.println("ct1 props:" + ct2.getProps());
        System.out.println("ct2 props:" + ct1.getProps());
        ct1.setName("new");
        System.out.println("ct1 name:" + ct1.getName());
        System.out.println("ct2 name:" + ct2.getName());
    }
}

输出如下:

ct1 and ct2 HashMap == test: true
ct1 props:{1=first, 2=second, 3=third, 4=fourth}
ct2 props:{1=first, 2=second, 3=third, 4=fourth}
ct1 name:new
ct2 name:first 

很明显,默认clone()函数使用的是浅复制的副本,ct2受ct1属性中的任何更改的影响,所以我们需要覆盖clone方法,这时我们反馈clone的注解。 在上面的类中添加下面代码:

  public Clone clone() {
        System.out.println("invoking overridden clone method");
        HashMap<String, String> hm = new HashMap<>();
        String key;
        Iterator<String> it = this.props.keySet().iterator();
        // 深复制属性
        while (it.hasNext()) {
            key = it.next();
            hm.put(key, this.props.get(key));
        }
        Clone ct = new Clone();
        ct.setId(this.id);
        ct.setName(this.name);
        ct.setProps(hm);
        return ct;
    }

再次运行:

ct1 and ct2 HashMap == test: false
ct1 props:{1=first, 2=second, 3=third}
ct2 props:{1=first, 2=second, 3=third, 4=fourth}
ct1 name:new
ct2 name:first

这时,我们就可以发现深复制与浅复制的区别了。

© 著作权归作者所有

上一篇: 自定义 ArrayList
下一篇: Gradle 深度刨析
拿客-三产
粉丝 110
博文 75
码字总数 121734
作品 0
丰台
程序员
私信 提问

暂无文章

OSChina 周一乱弹 —— 人生,还真是到处是意外

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享lil peep的单曲《High School》 《High School》- lil peep 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
38分钟前
6
0
Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
6
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
10
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部