JAVA中浅复制与深复制 |
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的全部变量都含有与原来的对象 雷同的值,而全部的对 其余对象的 引用 依旧指向原来的对象 。换言之,浅复制仅仅复制所考量的对象,而不复制它所 引用的对象 。 ⑵深复制(深克隆) 被复制对象的全部变量都含有与原来的对象 雷同的值,除去那些 引用 其余对象的变量 。那些 引用 其余对象的变量将指向被复制过的新对象,而不再是原有的那些被 引用的对象 。换言之,深复制把要复制的对象所 引用的对象都复制了一遍 。 2.Java的clone() 步骤 ⑴clone 步骤将对象复制了一份并返回给调用者 。普通而言,clone() 步骤满足: ①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象 ②对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样 ③假如对象x的equals() 步骤定义 适当,那么x.clone().equals(x)应该成立 。 ⑵Java中对象的克隆 ①为了猎取对象的一份拷贝,我们 可以利用Object类的clone() 步骤 。 ②在派生类中 遮蔽基类的clone() 步骤,并申明为public 。 ③在派生类的clone() 步骤中,调用super.clone() 。 ④在派生类中实现Cloneable接口 。 请看如下代码: class Student implements Cloneable { String name; int age; Student(String name,int age) { this.name=name; this.age=age; } public Object clone() { Object o=null; try { o=(Student)super.clone();//Object中的clone() 鉴别出你要复制的是哪一 // 个对象 。 } catch(CloneNotSupportedException e) { System.out.println(e.toString()); } return o; } } public static void main(String[] args) { Student s1=new Student("zhangsan",18); Student s2=(Student)s1.clone(); s2.name="lisi"; s2.age=20; System.out.println("name="+s1.name+","+"age="+s1.age);// 批改学生2后,不影响 //学生1的值 。 } 注明: ①为何我们在派生类中 遮蔽Object的clone() 步骤时, 定然要调用super.clone()呢?在运行时刻,Object中的clone() 鉴别出你要复制的是哪一个对象, 而后为此对象 调配空间,并进行对象的复制,将原始对象的内容逐个复制到新对象的存储空间中 。 ②继承自java.lang.Object类的clone() 步骤是浅复制 。以下代码 可以 证实之 。 class Professor { String name; int age; Professor(String name,int age) { this.name=name; this.age=age; } } class Student implements Cloneable { String name;//常量对象 。 int age; Professor p;//学生1和学生2的 引用值都是一样的 。 Student(String name,int age,Professor p) { this.name=name; this.age=age; this.p=p; } public Object clone() { Student o=null; try { o=(Student)super.clone(); } catch(CloneNotSupportedException e) { System.out.println(e.toString()); } o.p=(Professor)p.clone(); return o; } } public static void main(String[] args) { Professor p=new Professor("wangwu",50); Student s1=new Student("zhangsan",18,p); Student s2=(Student)s1.clone(); s2.p.name="lisi"; s2.p.age=30; System.out.println("name="+s1.p.name+","+"age="+s1.p.age);//学生1的 传授 //成为lisi,age为30 。 } 那应该如何实现深 品位的克隆,即 批改s2的 传授不会影响s1的 传授?代码改良如下 。 改良使学生1的Professor不转变(深 品位的克隆) class Professor implements Cloneable { String name; int age; Professor(String name,int age) { this.name=name; this.age=age; } public Object clone() { Object o=null; try { o=super.clone(); } catch(CloneNotSupportedException e) { System.out.println(e.toString()); } return o; } } class Student implements Cloneable { String name; int age; Professor p; Student(String name,int age,Professor p) { this.name=name; this.age=age; this.p=p; }
|