在 Java 中克隆一個物件
Aryan Tyagi
2023年10月12日
物件克隆是一種對物件進行精確複製的技術。它建立當前物件類的新例項,並用當前物件欄位的確切內容填充其所有欄位。
在本教程中,我們將在 Java 中克隆一個物件。
在 Java 中使用 Direct 方法克隆物件
在此方法中,我們將建立一個新物件並分配一些先前定義的物件作為其值。
請參考以下示例。
public class shallowcopy implements Cloneable {
int a, b;
public static void main(String args[]) throws CloneNotSupportedException {
shallowcopy d = new shallowcopy();
d.a = 10;
d.b = 12;
shallowcopy dtwo = d;
System.out.println("Original " + d.a);
System.out.println(d.b);
System.out.println("Shallow Copy " + dtwo.a);
System.out.println(dtwo.b);
d.a = 5;
System.out.println("Copy after modifying original");
System.out.println(dtwo.a);
}
}
輸出:
Original 10
12
Shallow Copy 10
12
Copy after modifying original
5
在上面的程式碼中,我們更改了原始程式碼並看到了所建立副本中反映的更改。這樣的克隆稱為淺拷貝。
在返回同一個類的新例項之前,淺拷貝產生同一個類的一個新例項並複製其欄位。在這個過程中,一個物件的內容被轉移到一個新的物件。但是,這兩個物件引用相同的值,因此對連結物件所做的任何修改都將反映在其他物件中。物件類具有克隆功能以及淺拷貝功能。物件類具有克隆功能以及淺拷貝功能。
在 Java 中使用 clone()
函式克隆物件
要克隆一個物件,請使用 Object 類的 clone()
方法。這是複製陣列的最快方法。
我們希望生成其物件克隆的類必須實現 Cloneable 介面。如果沒有實現 Cloneable 介面,clone()
函式會丟擲一個 CloneNotSupportedException
。
clone()
函式消除了在製作物件的精確副本時進行額外處理的需要。如果我們使用 new
,需要很長時間來處理,這就是我們使用物件克隆的原因。我們將使用它來建立一個深拷貝。
當一個專案與其引用的物件一起被複制時,它被稱為深拷貝。副本中所做的任何更改都不會反映在原件上。
例如,
import java.util.ArrayList;
public class deepcopy implements Cloneable {
int a, b;
public Object clone() throws CloneNotSupportedException {
return (deepcopy) super.clone();
}
public static void main(String args[]) throws CloneNotSupportedException {
deepcopy d = new deepcopy();
d.a = 10;
d.b = 12;
System.out.println("Original " + d.a);
System.out.println(d.b);
deepcopy dtwo = (deepcopy) d.clone();
System.out.println("Deep Copy " + dtwo.a);
System.out.println(dtwo.b);
d.a = 5;
System.out.println("Copy after modifying original");
System.out.println(dtwo.a);
}
}
輸出:
Original 10
12
Deep Copy 10
12
Copy after modifying original
10
在上面的示例中,對原始檔案所做的更改不會反映在深層副本中。
在 Java 中使用複製建構函式克隆物件
建構函式初始化某個類的物件。複製建構函式可以建立某個類的重複物件。
請參考下面的程式碼以瞭解如何初始化此類。
class copycon {
public String cc;
public copycon(String s) {
this.cc = s;
}
public copycon(copycon different) {
this.cc = different.cc; // copy constructor
}
}
class Main {
public static void main(String args[]) {
copycon c1 = new copycon("abc");
copycon c2 = new copycon(c1);
System.out.println(c2.cc);
}
}
輸出:
abc
這不會在 Java 中實現深度克隆。