深克隆


淺拷貝(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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM