java学习之路――对象的浅复制和深复制(一)

2014-11-24 02:57:45 · 作者: · 浏览: 3

对象的浅复制和深复制有两种方法:

第一种:通过重写clone()方法实现

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接口。

例如:

package com.lcq.clone;

/**

*

* 类名:CloneTest1

* 功能:对象的浅复制和深复制,通过继承Cloneable接口和重写clone()方法实现

* 时间:

*

* @version 1.0

* @author lcq

*

*/

public class CloneTest1 {

public static void main(String[] args) throws Throwable {

Teacher teacher = new Teacher();

teacher.setAge(20);

teacher.setName("teacher zhang");

Student st = new Student();

st.setAge(20);

st.setName("zhangsan");

st.setTeacher(teacher);

//打印出Student对象的属性值

System.out.println("st age:" +st.getAge());

System.out.println("st name:" +st.getName());

System.out.println(st.getTeacher().getAge());

System.out.println(st.getTeacher().getName());

Student st2 = (Student)st.clone();

//改变student的name值

st2.setName("lisi");

//改变teacher对象的name属性值

teacher.setName("teacher name change");

System.out.println("st name:" + st.getName());

System.out.println("st2 name:" + st2.getName());

//打印出Student类对象的teacher属性值,其值没有改变。

System.out.println(st2.getTeacher().getName());

}

}

class Student implements Cloneable

{

//定义属性

private int age;

private String name;

//包含一个Teacher对象的引用

private Teacher teacher;

public Teacher getTeacher() {

return teacher;

}

public void setTeacher(Teacher teacher) {

this.teacher = teacher;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

//重写父类的clone()方法,同时要保证其成员对象中也重写了父类的clone()方法

@Override

public Object clone() throws CloneNotSupportedException {

Student stu = (Student) super.clone();

stu.setTeacher((Teacher)stu.getTeacher().clone());

return stu;

}

}

class Teacher implements Cloneable

{

//定义属性

private int age;

private String name;

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

//重写父类的clone()方法

@Override

protected Object clone() throws CloneNotSupportedException {

Object obj = super.clone();