一、簡介
Java中複製對象是指創建一個新對象,它的值和原對象相同,但是它擁有自己的引用。Java中有兩種方式可以複製對象——淺複製(shallow copy)和深複製(deep copy)。淺複製僅僅複製對象本身和其中的基本類型成員變數,而不複製其他對象的引用。深複製則是複製對象和其內部的所有對象,包括非基本類型的成員變數對象。本文將詳細介紹如何在Java中實現淺複製和深複製。
二、淺複製
淺複製是將一個對象複製到一個新的對象中,但是新對象的成員變數只是原始對象成員變數的一個副本。如果成員變數中包含其他對象的引用,則只是複製了對象引用而非對象本身。因此,當原始對象或其副本改變內部共享對象時,兩個對象共享更改後的對象引用,這可能導致程序錯誤。以下是使用Java語言實現淺複製的代碼示例:
public class ShallowCopy implements Cloneable { private int number; private Integer integer; public ShallowCopy(int number, Integer integer) { this.number = number; this.integer = integer; } public Object clone() throws CloneNotSupportedException { return super.clone(); } public static void main(String[] args) throws CloneNotSupportedException { ShallowCopy original = new ShallowCopy(1, new Integer(2)); ShallowCopy clone = (ShallowCopy) original.clone(); System.out.println(clone.number); // 1 System.out.println(clone.integer); // 2 } }
在上述代碼示例中,使用Java語言的內置clone()方法實現了淺複製。通過運行main()方法,可以看出number和integer都被複製成了相同的值。因為Integer類是一個包裝類,它是一個對象。在複製時,只是將原始對象中的Integer對象引用複製到新對象中,因此兩個對象共享相同的Integer對象。
三、深複製
與淺複製相反,深複製是將一個對象及其內部所有對象都複製到一個新對象中。這意味著,原始對象和複製品的所有成員變數都是不同的對象,因此對於新對象的任何更改都不會影響原始對象。以下是使用Java語言實現深複製的代碼示例:
public class DeepCopy implements Cloneable { private int number; private List list; public DeepCopy(int number, List list) { this.number = number; this.list = list; } public Object clone() throws CloneNotSupportedException { DeepCopy deepCopy = (DeepCopy) super.clone(); deepCopy.list = new ArrayList(); for (Integer integer : this.list) { deepCopy.list.add(new Integer(integer)); } return deepCopy; } public static void main(String[] args) throws CloneNotSupportedException { List integers = new ArrayList(); integers.add(new Integer(1)); integers.add(new Integer(2)); DeepCopy original = new DeepCopy(3, integers); DeepCopy clone = (DeepCopy) original.clone(); clone.list.add(4); System.out.println(original.list); // [1, 2] System.out.println(clone.list); // [1, 2, 4] } }
在上述代碼示例中,使用Java語言的clone()方法實現了深複製。需要注意的是,當對象中的成員變數為非基本類型對象時,需要創建一個新的對象副本。在這個例子中,我們創建了一個新的ArrayList,並將原始對象中的所有元素以及所有元素的副本添加到新列表中,從而創建了一個新的深複製對象。運行main()方法,我們可以看到原始對象和clone對象是不同的對象,它們的list成員變數是獨立的,即clone對象中的添加操作不會影響原始對象。
四、小結
本文介紹了Java中淺複製和深複製對象的方法。通過代碼示例,我們可以看到如何使用Java語言內置的clone()方法來實現淺複製。同時,使用另一個對象方法可以實現深複製。深複製需要複製所有成員變數,包括所有的基本類型和非基本類型。它需要創建複製品及其內部每個對象的副本,以確保原始和克隆對象是完全獨立的。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/231735.html