浅复制与深复制概念
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