在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 接口,然後把對象(實際上只是對象的一個拷貝)寫到一個流裏,再從流裏讀出來,便可以重建對象。