java深拷贝和浅拷贝的总结

java里的clone分为: 
   A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 
b:  深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。 
 
Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点 
1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。 
2.在派生类的clone()方法中,调用super.clone()。 
3.在派生类中实现Cloneable接口。
 

注明:Object类里的clone方法是浅复制(浅克隆)

一般java对象

普通复制

  
  
  
  
  1. Book book1 = new Book(); 
  2. Book book2 = book1 ; //book1和book2指向同一个引用,book2的修改会影响book1 

深复制

  
  
  
  
  1. //Book本身要实现接口Cloneable,声明异常CloneNotSupportedException,重写方法clone()。  
  2. public class Book implements Cloneable{  
  3.     String bookName;  
  4.     double price;  
  5.     Person author;  
  6.     public Book(String bn,double price,Person author){  
  7.         bookName = bn;  
  8.         this.price = price;  
  9.         this.author = author;     
  10.     }     
  11.     public Object clone(){  
  12.     Book b = null;  
  13.     try{  
  14.        b = (Book)super.clone();  
  15.     }catch(CloneNotSupportedExceptione){  
  16.        e.printStackTrace();  
  17.     }  
  18.     return b;  
  19.     }  
  20.     public void display(){  
  21.         System.out.print(bookName + "/t" +price + "/t") ;  
  22.         author.display();     
  23.     }  
  24. }  

因为Object类里的clone方法是浅复制,所以当Book里面包含其他对象引用Person的时候,需要在对Book重写clone()方法的时候也调用Person的clone()方法。

  
  
  
  
  1. b.author =(Person)author.clone(); //将Person对象进行拷贝,Person对象需进行了拷贝 

List等集合的深复制

利用序列化来做深复制,把对象写到流里的过程是序列化(Serilization)过程,而把对象从流中读出来的过程则叫做反序列化(Deserialization)过程。应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。,利用这个特性,可以做深拷贝 。

  
  
  
  
  1. public List deepCopy(List src) throws IOException, ClassNotFoundException{    
  2.        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();    
  3.        ObjectOutputStream out = new ObjectOutputStream(byteOut);    
  4.        out.writeObject(src);    
  5.         
  6.        ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());    
  7.        ObjectInputStream in =new ObjectInputStream(byteIn);    
  8.        List dest = (List)in.readObject();    
  9.        return dest;    


参考:http://www.cnblogs.com/agilework/articles/2318887.html

http://forchenyun.iteye.com/blog/665046

 

你可能感兴趣的:(java,深拷贝,浅拷贝)