java淺拷貝和深拷貝的區別
淺拷貝是指:只複製一個物件,物件內部存在的指向其他物件陣列或者引用則不復制。
深拷貝是指:不僅複製當前的物件,如果物件中還存在引用,則將引用的物件一起復制。
java中使用到的clone方法是淺拷貝,下面是簡單演示:
首先定義一個簡單類A,申明一個屬性aa = 1;
public class A { int aa = 1; } 定義一個可克隆類C,在C類中申明瞭類A、一個int屬性b值為1;
public class C implements Cloneable{ A a = new A(); int b = 1; public Object clone(){ Object c = null; try { c = super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return c; } }
在測試類中,建立一個c類的物件,申明c1為c的克隆物件,在克隆後再次將c類中b屬性的值賦為10,A類中aa屬性賦值為10;
public class Test { public static void main(String[] args) { C c = new C(); C c1 = (C)c.clone(); c.a.aa = 10; c.b = 10; System.out.println(c.a.aa); System.out.println(c1.b); }
}
輸出的值依次為10和1;
可見C類中的A類並沒有被拷貝過來而只是獲得了引用。
通過序列化方式實現深拷貝:先將要拷貝物件寫入到記憶體中的位元組流中,然後再從這個位元組流中讀出剛剛儲存的資訊,作為一個新物件返回,那麼這個新物件和原物件就不存在任何地址上的共享,自然實現了深拷貝。