java(30) - 对象浅克隆和深克隆

来源:互联网 发布:软件质量品质管理 编辑:程序博客网 时间:2024/04/29 23:09

一.浅克隆和深克隆的概念:

       1).浅克隆:又称为浅复制,被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换而言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

       2).深克隆:又称为深复制,被复制的对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换而言之,深复制就是把要复制的对象所引用的对象都复制了一遍。

二.浅克隆实现:

<pre class="java" name="code"><strong><span style="font-size:18px;">public class Main {public static void main(String[] args) throws Exception {Student student1 = new Student();        student1.setName("张三");        student1.setSex("男");        student1.setNumber(10);        Student student2 = (Student)student1.clone();System.out.println(student2.getName() +" "+ student2.getNumber() +" "+ student2.getSex());        student1.setName("李四");System.out.println(student1.getName());System.out.println(student2.getName());System.out.println(student1 == student2);System.out.println(student1.getClass() == student2.getClass());}}class Student implements Cloneable{int number;String name;String sex;public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overrideprotected Object clone() throws CloneNotSupportedException {Object obj = super.clone(); return obj;}}</span></strong>


打印:

张三 10 男
李四
张三
false
true

Object的clone方法就是浅克隆,clone()方法满足(1).对任何对象obj,都有obj.clone()!=obj,克隆的对象与原对象不是一个对象。


三.深克隆实现(这种方式较为麻烦,一般用序列化实现):

public class Main {public static void main(String[] args) throws Exception {Teacher teacher = new Teacher();teacher.setName("李四");teacher.setNumber(20);Student stu = new Student();stu.setName("张三");stu.setNumber(10);stu.setSex("男");stu.setTeacher(teacher);Student stu2 = (Student)stu.clone();System.out.println(stu2.getTeacher().getName());teacher.setName("王五");//如果是浅克隆则打印王五,因为teacher引用没变,变得时候teacher中的name属性System.out.println(stu2.getTeacher().getName());}}class Teacher implements Cloneable{int number;String name;public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}}class Student implements Cloneable{int number;String name;String sex;    Teacher  teacher;    public Teacher getTeacher() {return teacher;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overrideprotected Object clone() throws CloneNotSupportedException {      Student student = (Student)super.clone();student.setTeacher((Teacher)student.getTeacher().clone());return student;}}

打印:

李四
李四



0 0
原创粉丝点击