程式設計語言的Copy基本分為引用Copy,淺Copy和深Copy。
引用Copy比較簡單,我們將一個引用指向一個對象,就是一個引用Copy,引用Copy不會建立對象,只會將引用指向已存在的對象,代碼如下:
Object o1 = new Object();<br />Object o2 = o1;
淺Copy是Java預設的Copy方法,在調用clone()方法時,Java將進行淺Copy,在該過程中,Java對該對象進行Copy,對其中的基礎資料型別 (Elementary Data Type)進行Copy,但是對該對象內部的引用,不進行Copy,也就是說Copy後新對象屬性中的引用還是指向原對象的屬性。淺Copy代碼如下:
class Province implements Cloneable {<br />private String name;</p><p>public String getName() {<br />return name;<br />}</p><p>public void setName(String name) {<br />this.name = name;<br />}</p><p>public Province() {<br />super();<br />// TODO Auto-generated constructor stub<br />}</p><p>public Province(String name) {<br />super();<br />this.name = name;<br />}</p><p>@Override<br />public Object clone() throws CloneNotSupportedException {<br />// TODO Auto-generated method stub<br />return super.clone();<br />}</p><p>@Override<br />public String toString() {<br />// TODO Auto-generated method stub<br />return name.toString();<br />}</p><p>}
深Copy是要將新對象中的引用也做clone,也就是建立一個全新的對象,實現原理是在寫clone方法時對該對象中的引用分別調用clone方法,代碼如下 :
class City implements Cloneable {<br />private String name;</p><p>public String getName() {<br />return name;<br />}</p><p>public void setName(String name) {<br />this.name = name;<br />}</p><p>private Province province;</p><p>public Province getProvince() {<br />return province;<br />}</p><p>public void setProvince(Province province) {<br />this.province = province;<br />}</p><p>public City(String name, Province province) {<br />super();<br />this.name = name;<br />this.province = province;<br />}</p><p>public City() {<br />super();<br />// TODO Auto-generated constructor stub<br />}</p><p>@Override<br />public Object clone() throws CloneNotSupportedException {<br />// TODO Auto-generated method stub<br /> City city = (City) super.clone();<br /> city.province = (Province) province.clone();<br /> return city;<br />}</p><p>@Override<br />public String toString() {<br />// TODO Auto-generated method stub<br />return province.toString() + ":" + name.toString();<br />}</p><p>}