摘要:類自帶了本地的方法,該方法會返回現有實例的副本。如果要使用克隆,必須實現接口,以便它不會在運行時拋出。如果函數會返回對象副本,那么在什么情況下我們需要重寫它讓我們運行下面的類來更好的理解。
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 HashMapprops; 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"); HashMaphm = new HashMap<>(); String key; Iterator 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
這時,我們就可以發現深復制與淺復制的區別了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66865.html
摘要:有一些設計缺陷,其中最大的一個是接口沒有方法。這基本上就是你用復制構造函數做的事情。復制構造方法有幾個優點,我在本書中有討論。的方法是非常棘手的。它創建一個對象而不調用構造函數。無法保證它保留構造函數建立的不變量。 前言 在Java API中,可以通過實現Cloneable接口并重寫clone方法實現克隆,但Java設計者否定了使用clone創建新對象的方法. 1. clone方法實現...
摘要:不合規的代碼示例合規解決方案參閱復制構造函數與克隆也可以參閱應該實現克隆覆蓋的類應為并調用下面為引文翻譯談設計與作者的對話,作者首次在上發表,年月日復制構造函數與克隆在你的書中,你建議使用復制構造函數而不是實現和編寫。 今天在用 sonar 審核代碼, 偶然看到下面的提示:showImg(https://segmentfault.com/img/bVbqioZ?w=858&h=116)...
摘要:判斷另外一個對象是否與當前對象相等返回當前對象的哈希值返回一個表示當前對象的字符串喚醒一個等待當前對象的鎖監視器的線程。 原文鏈接:http://www.javacodegeeks.com/2015/09/using-methods-common-to-all-objects.html 本文是Java進階課程的第二篇。 本課程的目標是幫你更有效的使用Java。其中討論了一些高級主題,包...
摘要:如果一個對象的初始化需要很多其他對象的數據準備或其他資源的繁瑣計算,那么可以使用原型模式。當需要一個對象的大量公共信息,少量字段進行個性化設置的時候,也可以使用原型模式拷貝出現有對象的副本進行加工處理。 1、什么是原型模式Specify the kinds of objects to create using a prot...
閱讀 3431·2021-10-14 09:42
閱讀 2718·2021-09-08 10:44
閱讀 1300·2021-09-02 10:18
閱讀 3600·2021-08-30 09:43
閱讀 2794·2021-07-29 13:49
閱讀 3719·2019-08-29 17:02
閱讀 1576·2019-08-29 15:09
閱讀 1035·2019-08-29 11:01