淺復制與深復制概念
1.淺復制(淺克隆)
被復制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。換言之,淺復制僅僅復制所考慮的對象,而不復制它所引用的對象。
2.深復制(深克隆)
被復制對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被復制過的新對象,而不再是原有的那些被引用的對象。換言之,深復制把要復制的對象所引用的對象都復制了一遍。
Java的clone()方法
1.clone方法將對象復制了一份並返回給調用者。一般而言,clone()方法滿足
2.對任何的對象x,都有x.clone() !=x 因為克隆對象與原對象不是同一個對象
3.對任何的對象x,都有x.clone().getClass()= =x.getClass()//克隆對象與原對象的類型一樣
4.如果對象x的equals()方法定義恰當,那么x.clone().equals(x)應該成立
Java中對象的克隆
1.為了獲取對象的一份拷貝,我們可以利用Object類的clone()方法
2.在派生類中覆蓋基類的clone()方法,並聲明為public
3.在派生類的clone()方法中,調用super.clone()
4.在派生類中實現Cloneable接口
實例代碼:
1 public class User implements Cloneable { 2 3 private String name; 4 private Integer age; 5 6 7 public User(String name, Integer age) { 8 super(); 9 this.name = name; 10 this.age = age; 11 } 12 13 public String getName() { 14 return name; 15 } 16 17 public void setName(String name) { 18 this.name = name; 19 } 20 21 public Integer getAge() { 22 return age; 23 } 24 25 public void setAge(Integer age) { 26 this.age = age; 27 } 28 29 @Override 30 public Object clone() { 31 Object o = null; 32 try { 33 //Object中的clone()識別出你要復制的是哪一個對象 34 o = (User) super.clone(); 35 } catch (CloneNotSupportedException e) { 36 System.out.println(e.toString()); 37 } 38 return o; 39 } 40 41 42 } 43 44 45 public class Demo06 { 46 47 public static void main(String[] args) { 48 49 User u = new User("xiaoming",20); 50 User u2 = (User)u.clone(); 51 u2.setName("lisi"); 52 u2.setAge(30); 53 System.out.println("name="+u.getName()+","+"age="+u.getAge()); 54 System.out.println("name="+u2.getName()+","+"age="+u2.getAge()); 55 } 57 }72 73 輸出結果: 74 name=xiaoming,age=20 75 name=lisi,age=30 76 77 說明: 78 為什么我們在派生類中覆蓋Object的clone()方法時,一定要調用super.clone()呢?在運行時刻,Object中的clone()識別出你要復制的是哪一個對象,然后為此對象分配空間,並進行對象的復制,將原始對象的內容一一復制到新對象的存儲空間中。
淺克隆

1 public class Professor { 2 3 private String name; 4 private Integer age; 5 6 public Professor(String name, Integer age) { 7 super(); 8 this.name = name; 9 this.age = age; 10 } 11 public String getName() { 12 return name; 13 } 14 public void setName(String name) { 15 this.name = name; 16 } 17 public Integer getAge() { 18 return age; 19 } 20 public void setAge(Integer age) { 21 this.age = age; 22 } 23 } 24 25 public class Student implements Cloneable { 26 27 private String name; 28 private Integer age; 29 30 //引用 31 private Professor professor; 32 33 public Student(String name, Integer age, Professor professor) { 34 super(); 35 this.name = name; 36 this.age = age; 37 this.professor = professor; 38 } 39 40 public String getName() { 41 return name; 42 } 43 44 public void setName(String name) { 45 this.name = name; 46 } 47 48 public Integer getAge() { 49 return age; 50 } 51 52 public void setAge(Integer age) { 53 this.age = age; 54 } 55 56 public Professor getProfessor() { 57 return professor; 58 } 59 60 public void setProfessor(Professor professor) { 61 this.professor = professor; 62 } 63 64 @Override 65 public Object clone() { 66 Object o = null; 67 try { 68 //Object中的clone()識別出你要復制的是哪一個對象 69 o = (Student) super.clone(); 70 } catch (CloneNotSupportedException e) { 71 System.out.println(e.toString()); 72 } 73 return o; 74 } 75 } 76 77 測試 78 public class Demo07 { 79 80 public static void main(String[] args) { 81 82 Professor p = new Professor("wangwu", 50); 83 Student s1 = new Student("xiaoming",20,p); 84 Student s2 = (Student) s1.clone(); 85 s2.getProfessor().setName("wangxiaowu"); 86 s2.getProfessor().setAge(30); 87 System.out.println("name="+s1.getProfessor().getName()+","+"age="+s1.getProfessor().getAge()); 88 System.out.println("name="+s2.getProfessor().getName()+","+"age="+s2.getProfessor().getAge()); 89 } 90 91 } 92 93 輸出結果: 94 name=wangxiaowu,age=30 95 name=wangxiaowu,age=30
深克隆
1 public class Professor implements Cloneable { 2 3 private String name; 4 private Integer age; 5 6 public Professor(String name, Integer age) { 7 this.name = name; 8 this.age = age; 9 } 10 11 public String getName() { 12 return name; 13 } 14 15 public void setName(String name) { 16 this.name = name; 17 } 18 19 public Integer getAge() { 20 return age; 21 } 22 23 public void setAge(Integer age) { 24 this.age = age; 25 } 26 27 public Object clone() { 28 29 Object o = null; 30 try { 31 o = super.clone(); 32 } catch (CloneNotSupportedException e) { 33 System.out.println(e.toString()); 34 } 35 return o; 36 } 37 38 } 39 40 Student類: 41 public class Student implements Cloneable { 42 43 private String name; 44 private Integer age; 45 private Professor professor; 46 47 public Student(String name, Integer age, Professor professor) { 48 this.name = name; 49 this.age = age; 50 this.professor = professor; 51 } 52 53 public String getName() { 54 return name; 55 } 56 57 public void setName(String name) { 58 this.name = name; 59 } 60 61 public Integer getAge() { 62 return age; 63 } 64 65 public void setAge(Integer age) { 66 this.age = age; 67 } 68 69 public Professor getProfessor() { 70 return professor; 71 } 72 73 public void setProfessor(Professor professor) { 74 this.professor = professor; 75 } 76 77 public Object clone() { 78 79 Student o = null; 80 try { 81 o = (Student) super.clone(); 82 } catch (CloneNotSupportedException e) { 83 System.out.println(e.toString()); 84 } 85 o.professor = (Professor) professor.clone(); 86 return o; 87 } 88 } 89 90 測試: 91 public class Demo01 { 92 93 public static void main(String[] args) { 94 95 Professor p = new Professor("wangwu", 50); 96 Student s1 = new Student("xiaoming", 20, p); 97 Student s2 = (Student) s1.clone(); 98 s2.getProfessor().setName("xiaowangwu"); 99 s2.getProfessor().setAge(40); 100 System.out.println("name=" + s1.getProfessor().getName() 101 + "," + "age=" + s1.getProfessor().getAge()); 102 System.out.println("name=" + s2.getProfessor().getName() 103 + "," + "age=" + s2.getProfessor().getAge()); 104 } 105 } 106 107 輸出結果: 108 109 name=wangwu,age=50 110 name=xiaowangwu,age=40