在項目中看到前人寫的代碼用到了 spring 框架的 BeanUtils.copyProperties 方法,想了解一下這個方法是深拷貝仍是淺拷貝,其實這個方法內部對於基本數據類型實現了深拷貝,但對於引用類型仍是淺拷貝的。spring
在 Java 中,除了基本數據類型(元類型)以外,還存在類的實例對象這個引用數據類型。而通常使用 『 = 』號作賦值操做的時候。對於基本數據類型,其實是拷貝的它的值,可是對於對象而言,其實賦值的只是這個對象的引用,將原對象的引用傳遞過去,他們實際上仍是指向的同一個對象。segmentfault
而淺拷貝和深拷貝就是在這個基礎之上作的區分,若是在拷貝這個對象的時候,只對基本數據類型進行了拷貝,而對引用數據類型只是進行了引用的傳遞,而沒有真實的建立一個新的對象,則認爲是淺拷貝。反之,在對引用數據類型進行拷貝的時候,建立了一個新的對象,而且複製其內的成員變量,則認爲是深拷貝。框架
所以,所謂的淺拷貝和深拷貝,只是在拷貝對象的時候,對 類的實例對象 這種引用數據類型的不一樣操做而已。spa
總結來講:對象
淺拷貝和深拷貝實際上是相對的:get
那麼,如何進行一個深拷貝呢?io
比較經常使用的方案有兩種:基礎