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;

}