通過與C++程式對比,徹底搞清楚JAVA的物件拷貝
阿新 • • 發佈:2020-06-11
[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