JAVA深復制(深克隆)與淺復制(淺克隆)


淺復制與深復制概念

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
View Code

深克隆

 

  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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM