1. 程式人生 > >通過與C++程式對比,徹底搞清楚JAVA的物件拷貝

通過與C++程式對比,徹底搞清楚JAVA的物件拷貝

[toc] #### 一、背景 JAVA程式設計中的物件一般都是通過new進行建立的,新建立的物件通常是初始化的狀態,但當這個物件某些屬性產生變更,且要求用一個物件副本來儲存當前物件的“狀態”,這時候就需要用到物件拷貝的功能,以便封裝物件之間的快速克隆。 #### 二、JAVA物件拷貝的實現 ##### 2.1 淺拷貝 - 被複制的類需要實現Clonenable介面; - 覆蓋clone()方法,呼叫super.clone()方法得到需要的複製物件; - 淺拷貝對基本型別(boolean,char,byte,short,float,double.long)能完成自身的複製,但對於引用型別只對引用地址進行拷貝。 -- 下面我們用一個例項進行驗證: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200610162818146.png) ```java /** * 單隻牌 * * @author zhuhuix * @date 2020-06-10 */ public class Card implements Comparable, Serializable,Cloneable { // 花色 private String color = ""; //數字 private String number = ""; public Card() { } public Card(String color, String number) { this.color = color; this.number = number; } public String getColor() { return this.color; } public void setColor(String color) { this.color = color; } public String getNumber() { return this.number; } public void setNumber(String number) { this.number = number; } @Override public String toString() { return this.color + this.number; } @Override public int compareTo(Object o) { if (o instanceof Card) { int thisColorIndex = Constant.COLORS.indexOf(this.getColor()); int anotherColorIndex = Constant.COLORS.indexOf(((Card) o).getColor()); int thisNumberIndex = Constant.NUMBERS.indexOf(this.getNumber()); int anotherNumberIndex = Constant.NUMBERS.indexOf(((Card) o).getNumber()); // 大小王之間相互比較: 大王大於小王 if ("JOKER".equals(this.color) && "JOKER".equals(((Card) o).getColor())) { return thisColorIndex > anotherColorIndex ? 1 : -1; } // 大小王與數字牌之間相互比較:大小王大於數字牌 if ("JOKER".equals(this.color) && !"JOKER".equals(((Card) o).getColor())) { return 1; } if (!"JOKER".equals(this.color) && "JOKER".equals(((Card) o).getColor())) { return -1; } // 數字牌之間相互比較: 數字不相等,數字大則牌面大;數字相等 ,花色大則牌面大 if (thisNumberIndex == anotherNumberIndex) { return thisColorIndex > anotherColorIndex ? 1 : -1; } else { return thisNumberIndex > anotherNumberIndex ? 1 : -1; } } else { return -1; } } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } ``` ```java /** * 撲克牌常量定義 * * @author zhuhuix * @date 2020-06-10 */ public class Constant { // 紙牌花色:黑桃,紅心,梅花,方塊 final sta