Java中的複製

在Java中將一個對象的引用複製給另外一個對象,一共有三種方式:直接賦值,淺拷貝,深拷貝。這三種方式實際上都是拷貝對象。

  • 直接賦值複製

直接賦值:如 A a1 = a2,我們需要理解的是這實際上覆制的是引用,也就是說 a1 和 a2 指向的是同一個對象。因此,當 a1 變化的時候, a2 裏面的成員變量也會跟着變化。

  • 淺拷貝

淺拷貝:複製引用但不復制引用的對象。創建一個新對象,然後將當前對象的非靜態字段複製到該新對象, 如果字段是值類型的,那麼對該字段執行復制;如果該字段是引用類型的話,則複製引用但不復制引用的對象。因此,原始對象及其副本引用同一個對象。如:

class Person implements Cloneable{
	public Object clone() {
		try {
			return (Resume)super.clone();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}
  • 深拷貝

深拷貝:複製對象和其應用對象。深拷貝不僅複製對象本身,而且複製對象包含的引用指向的所有對象。如:

class Student implements Cloneable {
	String name;
	int age;
	Professor p;
	Student(String name, int age, Professor p) {
		this.name = name;
		this.age = age;
		this.p = p;
	}
	public Object clone() {
		Student o = null;
		try {
			o = (Student) super.clone();
		} catch (CloneNotSupportedException e) {
			System.out.println(e.toString());
		}
		o.p = (Professor) p.clone();
		return o;
	}
}

Tips:序列化是深拷貝的一種實現。在 Java 語言裏深複製一個對象,常常可以先使對象實現 Serializable 接口,然後把對象(實際上只是對象的一個拷貝)寫到一個流裏,再從流裏讀出來,便可以重建對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章