1. 程式人生 > >JavaSE--對象克隆

JavaSE--對象克隆

pub 基本 ots com 基本類 getdate .get 包含 system

當拷貝一個變量時,原始變量與拷貝變量引用同一個對象,這就是說,改變一個變量所引用的對象將會對另一個變量產生影響。

技術分享

如果創建一個對象的新的 copy,他的最初狀態與 original 一樣,但以後將可以各自改變各自的狀態,那就需要使用 clone 方法。

但是 clone 默認的是淺拷貝。

clone 方法是 Object 類的一個 protected 方法,也就是說,在用戶編寫的代碼中不能直接調用它。

clone 方法只對各個域進行對應的拷貝。如果對象中的所有數據域都屬於數值或基本類型,這樣拷貝域沒有任何問題。但是,如果在對象中包含了子對象的引用,拷貝的結果會使得兩個域引用同一個子對象,因此原始對象與克隆對象共享這部分信息。

技術分享

技術分享

如果原始對象與淺克隆對象共享的子對象是不可變的,將不會產生任何問題。然而,更常見的是子對象可變,因此必須重新定義 clone 方法,以便實現克隆子對象的深拷貝。

如果需要做拷貝,必須實現 Cloneable 接口,Cloneable 是一個標記接口,表明類設計者知道要進行克隆處理。如果一個對象需要克隆,而沒有實現 Cloneable 接口,就會產生一個已檢驗異常。

實現深拷貝,必須克隆所有可變的實例域。

所有的數組類型均包含了一個 clone 方法,這個方法被設為 public,而不是 protected。

 1 package org.wzh.clone;
 2 
 3 import
java.util.Arrays; 4 import java.util.Date; 5 6 public class CloneDemo1 { 7 8 public static void main(String[] args) throws CloneNotSupportedException { 9 Student student = new Student("Timo", 11002910, new Date()); 10 System.out.println(student + " " + student.getDate().hashCode());
11 Student student2 = student.clone(); 12 student2.setDate(new Date()); 13 System.out.println(student2 + " " + student2.getDate().hashCode()); 14 System.out.println(student + " " + student.getDate().hashCode()); 15 16 int[] array = {1, 2, 3, 4}; 17 int[] array2 = array.clone(); 18 System.out.println(Arrays.toString(array)); 19 System.out.println(Arrays.toString(array2)); 20 } 21 22 } 23 24 class Student implements Cloneable { 25 26 private String name; 27 private int no; 28 private Date date; 29 30 public Student(String name, int no, Date date) { 31 super(); 32 this.name = name; 33 this.no = no; 34 this.date = date; 35 } 36 37 38 39 @Override 40 protected Student clone() throws CloneNotSupportedException { 41 // TODO Auto-generated method stub 42 Student student = (Student) super.clone(); 43 //錯開時間 44 try { 45 Thread.sleep(1000); 46 } catch (InterruptedException e) { 47 // TODO Auto-generated catch block 48 e.printStackTrace(); 49 } 50 student.date = (Date) date.clone(); 51 return student; 52 } 53 54 55 56 public String getName() { 57 return name; 58 } 59 60 public void setName(String name) { 61 this.name = name; 62 } 63 64 public int getNo() { 65 return no; 66 } 67 68 public void setNo(int no) { 69 this.no = no; 70 } 71 72 public Date getDate() { 73 return date; 74 } 75 76 public void setDate(Date date) { 77 this.date = date; 78 } 79 80 }

JavaSE--對象克隆