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
原文地址:https://www.cnblogs.com/qlwang/p/7889802.html