深克隆
淺拷貝(Object類中的clone()方法)是指在拷貝對象時,對于基本數據類型的變量會重新復制一份,而對于引用類型的變量只是對引用進行拷貝。
深拷貝(或叫深克隆) 則是對對象及該對象關聯的對象內容,都會進行一份拷貝。
?
?
實體類:
package com.lin.test;import java.io.Serializable;/*** @athor tianlin** 2015年6月28日 下午1:56:18***/ public class Dog implements Serializable{private static final long serialVersionUID = 1L;private String dogName;public String getDogName() {return dogName;}public void setDogName(String dogName) {this.dogName = dogName;}}package com.lin.test;import java.io.Serializable;/*** @athor tianlin** 2015年6月28日 下午1:43:24***/ public class User implements Serializable{private static final long serialVersionUID = 1L;private String username;private Dog dog;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Dog getDog() {return dog;}public void setDog(Dog dog) {this.dog = dog;}}?
克隆執行類:
package com.lin.test;import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream;/*** @athor tianlin** 2015年6月28日 下午1:44:08***/ public class ObjCloner {@SuppressWarnings("unchecked")public static <T>T cloneObj(T obj){T retVal = null; try{// 將對象寫入流中ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(obj);// 從流中讀出對象ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);retVal = (T)ois.readObject();}catch(Exception e){e.printStackTrace();}return retVal;}}?
測試類:
package com.lin.test; /*** @athor tianlin** 2015年6月28日 下午1:42:47***/ public class CloneTest {public static void main(String[] args) {User user = new User();user.setUsername("張三");Dog dog = new Dog();dog.setDogName("小狗1");user.setDog(dog);User user2 = ObjCloner.cloneObj(user);System.out.println("user username : "+user.getUsername());System.out.println("user dogname : " + user.getDog().getDogName());System.out.println("user2 username : "+user2.getUsername());System.out.println("user2 dogname : " + user2.getDog().getDogName());System.out.println(" -------------------------------------");user2.setUsername("李四");user2.getDog().setDogName("小狗2");;System.out.println("user username : "+user.getUsername());System.out.println("user dogname : " + user.getDog().getDogName());System.out.println("user2 username : "+user2.getUsername());System.out.println("user2 dogname : " + user2.getDog().getDogName());}}?
運行結果:
user username : 張三 user dogname : 小狗1 user2 username : 張三 user2 dogname : 小狗1------------------------------------- user username : 張三 user dogname : 小狗1 user2 username : 李四 user2 dogname : 小狗2 View Code?
轉載于:https://www.cnblogs.com/Jtianlin/p/4605477.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結