1. 程式人生 > >java對象的克隆

java對象的克隆

tput div 技術分享 exce name 還需 姓名 serializa static

java對象克隆方式主要有兩種:淺克隆和深克隆

首先,不要把對象的克隆和對象的賦值搞混了,看下圖

技術分享

p2 = p1;就是賦值操作,賦值操作只是讓被賦值對象指向之前對象的地址,實際上的物理內存是一塊,而克隆操作的結果應該是兩個對象分別指向內容相同的兩塊內存。如下就是克隆操作後的狀態:

技術分享

下面說淺克隆和深克隆:

深克隆和淺克隆的區別主要出現在類裏有外部類對象時,如下,Person類中有Address類的對象

 1 package cn.itcast.copy;
 2 
 3 import java.io.Serializable;
 4 
 5 class Address implements Serializable{
6 7 String city; 8 9 public Address(String city){ 10 this.city = city; 11 } 12 } 13 14 15 public class Person implements Cloneable,Serializable { 16 17 int id; 18 19 String name; 20 21 Address address; 22 23 public Person(int id, String name) {
24 this.id = id; 25 this.name = name; 26 } 27 28 29 public Person(int id, String name, Address address) { 30 this.id = id; 31 this.name = name; 32 this.address = address; 33 System.out.println("=======構造方法調用了==="); 34 } 35 36 37
@Override 38 public String toString() { 39 return "編號:"+ this.id+" 姓名:"+ this.name+" 地址:"+ address.city; 40 } 41 42 43 @Override 44 public Object clone() throws CloneNotSupportedException { 45 return super.clone(); 46 } 47 }

那麽如果對Person類的對象進行克隆就會涉及到淺克隆和深克隆的問題,先用兩張圖表現淺克隆和深克隆的不同。

技術分享

技術分享

第一個圖是淺克隆結果,第二個是深克隆結果,也就是說淺克隆只能克隆當前對象,不能克隆當前對象指向的外部類的對象,而深克隆是克隆所有關聯的數據和對象。

下面我們說兩種克隆的實現:

如果一個類可能涉及到被克隆操作,那麽久需要實現Cloneable接口,深克隆還需要實現Serializable 接口(淺克隆不用),如上邊的Person就實現了相關接口,淺克隆只需要調用實現的clone方法就可以了:

 1 public class Demo1 {
 2     
 3     
 4     public static void main(String[] args) throws Exception {
 5         Address address = new Address("廣州");
 6         Person p1 = new Person(110,"狗娃",address);
 7         Person p2 = (Person) p1.clone(); //clone() 克隆了一個對象。
 8         
 9         p2.name = "狗剩";
10         p2.address.city ="長沙";
11         System.out.println("p1:"+p1);
12         System.out.println("p2:"+ p2);        
13         
14     }
15 
16 }

淺克隆的原理很簡單,其簡單程度和復制一樣好理解,深克隆不同,為了實現深克隆,需要先把需要被克隆的對象保存到制定文件中,然後再把文件中內容賦值給新的對象才能完成克隆,所以就涉及到了流操作:

 1 public class Demo2 {
 2 
 3     public static void main(String[] args) throws IOException, ClassNotFoundException {
 4         Address address = new Address("廣州");
 5         Person p1 = new Person(110,"狗娃",address);
 6         writeObj(p1);
 7         Person p2  =readObj();
 8         
 9         p2.address.city = "長沙";
10         System.out.println("p1:"+ p1);
11         System.out.println("p2:"+ p2);        
12     }
13     
14     //再從文件中讀取對象的信息
15     public static Person readObj() throws ClassNotFoundException, IOException{
16         FileInputStream fileInputStream = new FileInputStream("F:\\obj.txt");
17         //創建對象的輸入流對象
18         ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
19         return (Person) objectInputStream.readObject();
20     }
21     
22     //先要把對象寫到文件上。
23     public static void writeObj(Person p) throws IOException{
24         //建立一個文件 的輸出流對象
25         FileOutputStream fileOutputStream  = new FileOutputStream("F:\\obj.txt");
26         //建立對象的輸出流
27         ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
28         //把對象寫出
29         objectOutputStream.writeObject(p);
30         //關閉資源
31         objectOutputStream.close();
32         
33     }    
34     
35 }

java對象的克隆