摘要:本文將詳細介紹Java中的深拷貝和淺拷貝概念,通過分析源碼和舉例說明,幫助讀者更好地理解這兩種拷貝方式的區別及應用場景。
一、深拷貝與淺拷貝的概念
深拷貝:復制一個對象后,無論是基本數據類型還是引用類型,都是重新創建的。簡單來說,深拷貝就是進行了完全徹底的復制。
淺拷貝:對基本數據類型進行拷貝時,是值傳遞;對引用數據類型進行拷貝時,只是進行了引用傳遞,沒有真實創建新的對象。
二、深拷貝與淺拷貝的實現
- 深拷貝
Java中,所有的對象都繼承自Object類,Object類中提供了一個方法供我們對Java對象進行拷貝:clone()。要想成功調用這個方法,首先該類要實現Cloneable接口,并覆蓋clone()方法。
深拷貝的實現過程如下:
(1)實現Cloneable接口。
(2)覆蓋Object類的clone()方法。
(3)在clone()方法中,對基本類型數據進行值傳遞,對引用類型數據創建一個新的對象,并復制其內容。 - 淺拷貝
Java中的淺拷貝則是僅對基本數據類型進行值傳遞,對引用數據類型進行引用傳遞。當引用類型數據發生變化時,淺拷貝的對象也會受到影響。
三、實例演示
下面通過一個具體的例子來演示深拷貝和淺拷貝的區別。
假設有一個Person類,其中包含兩個屬性:一個整數類型的基本數據類型變量a,和一個String類型的引用數據類型變量b。
public class Person implements Cloneable {private int a;private String b;public Person(int a, String b) {this.a = a;this.b = b;}@Overrideprotected Object clone() throws CloneNotSupportedException {Person clonedPerson = (Person) super.clone();clonedPerson.a = a; // 基本數據類型值傳遞clonedPerson.b = (String) b.clone(); // 引用數據類型值傳遞return clonedPerson;}
}
現在創建兩個Person對象,分別進行深拷貝和淺拷貝。
public class Main {public static void main(String[] args) throws CloneNotSupportedException {Person person1 = new Person(1, "Hello");Person person2 = person1.clone();System.out.println("person1.a: " + person1.a);System.out.println("person2.a: " + person2.a);person1.b = "World";System.out.println("person1.b: " + person1.b);System.out.println("person2.b: " + person2.b);}
}
運行結果如下:
person1.a: 1
person2.a: 1
person1.b: World
person2.b: Hello
從這個例子可以看出,淺拷貝時,person2的b屬性受到了person1變化的影響;而深拷貝時,person2的b屬性獨立于person1,變化不會相互影響。
總結
深拷貝和淺拷貝在Java中有著明顯的區別。深拷貝進行了徹底的復制,無論是基本數據類型還是引用數據類型,都不會受到原對象的影響;而淺拷貝則只是對基本數據類型進行值傳遞,對引用數據類型進行引用傳遞,導致對象間的關系仍然存在,容易受到原對象的影響。在實際開發中,我們需要根據不同的場景選擇合適的拷貝方式,以滿足程序的設計需求。
來源:Java技術棧公眾號