說到克隆,其實是個比較簡單的概念,跟現實生活正的克隆一樣,復制一個一模一樣的對象出來。clone()這個方法是從Object繼承下來的,一個對象要實現克隆,需要實現一個叫做Cloneable的接口,這個接口沒有什么方法,和Comparable接口差不多,僅僅是起一個標志作用,實現了這個接口你就能實現克隆操作。
這里有兩個概念,深度克隆和淺度克隆,這東西雖然平常不怎么用,但是了解一下還是有必要的。Object中的克隆方法是淺度克隆,JDK規定了克隆需要滿足的一些條件,簡要總結一下就是:對某個對象進行克隆,對象的的成員變量如果包括引用類型或者數組,那么克隆的時候其實是不會把這些對象也帶着復制到克隆出來的對象里面的,只是復制一個引用,這個引用指向被克隆對象的成員對象,但是基本數據類型是會跟着被帶到克隆對象里面去的。而深度可能就是把對象的所有屬性都統統復制一份新的到目標對象里面去。簡單畫個圖:
寫了幾行代碼測試一下:(針對數組,對象其實跟數組是一樣的)
1 class Person implements Cloneable { 2 String name; 3 String password; 4 String[] arrFavor; 5 6 public Person(String name, String password, String[] arrFavor) { 7 this.name = name; 8 this.password = password; 9 this.arrFavor = arrFavor; 10 } 11 12 @Override 13 protected Object clone() { 14 Person person = null; 15 try { 16 person = (Person) super.clone(); 17 // person.arrFavor = arrFavor.clone(); 18 return person; 19 } catch (CloneNotSupportedException e) { 20 e.printStackTrace(); 21 } 22 return null; 23 } 24 } 25 26 public class Test4 { 27 public static void main(String[] args) { 28 String[] arrFavor = { "basketball", "football" }; 29 Person person = new Person("Jay", "123", arrFavor); 30 Person p = (Person) person.clone(); 31 System.out.println(p.name); 32 System.out.println(p.password); 33 p.name = "Jolin"; 34 p.password = "555"; 35 p.arrFavor[0] = "valiball"; 36 for (String favor : p.arrFavor) { 37 System.out.print(favor + " "); 38 } 39 System.out.println(); 40 for (String favor : person.arrFavor) { 41 System.out.print(favor + " "); 42 } 43 System.out.println(); 44 } 45 } 46 // 結果 47 // Jay 48 // 123 49 // valiball football 50 // valiball football
而如果要進行所謂的深度克隆,在重寫clone方法的時候把屬性也克隆一下,也就是上面代碼的去掉17行注釋。