java深copy (伪深copy)【原】

时间:2021-03-23 10:17:16

 

Teacher.java

package test.clone;

/**
* 老师
* 深copy需要实现Cloneable接口
*
@author King
*
*/
public class Teacher implements Cloneable {

private String name;

private int age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "Teacher [name=" + name + ", age=" + age + "]";
}

public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

 

Student.java

package test.clone;

/**
* 学生
* 浅copy需要实现Cloneable接口
*
@author King
*
*/
public class Student implements Cloneable {

private String name;

private int age;

private Teacher teacher;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Teacher getTeacher() {
return teacher;
}

public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}

@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", Teacher=" + teacher + "]";
}

//浅copy
public Object clone() throws CloneNotSupportedException {
return super.clone();
}

/**
* 浅copy (同clone()方法)
* 浅copy只对基本类型和String类型做全新复制,
* 属性对象引用是不会全新复制的,最终新copy出来的属性对象引用的还是同一个堆内存区域,比如teacher属性
*
@return
*
@throws CloneNotSupportedException
* ......
* @time 2018年1月26日 下午8:07:11
*
@author King
*/
public Object shallowClone() throws CloneNotSupportedException {
return super.clone();
}

/**
* 伪深copy
* 这种伪深copy模式,其实还是使用了浅copy技术,只是把属性对象再次赋了新的浅copy.
* 当对象比较简单时可以用这种模式,因为它比序列化深copy要来得快,还是定制化copy哪些属性
*
@return
*
@throws CloneNotSupportedException
* ......
* @time 2018年1月26日 下午8:09:39
*
@author King
*/
public Object deepClone() throws CloneNotSupportedException {
Student stu
= (Student) super.clone();
Teacher t2
= (Teacher) teacher.clone();
stu.setTeacher(t2);
return stu;
}

}

 

 

FakeDeepCopy.java 

伪深copy调用样例

package test.clone;

/**
* fakeDeepCopy,其实是一种伪深copy,对象对比简单时可以使用这种技术
* *
@author King
*
*/
public class FakeDeepCopy {

public static void main(String[] args) {
Teacher techarAAA
= new Teacher();
techarAAA.setName(
"Teacher AAA");
techarAAA.setAge(
30);

Student studentAAA
= new Student();
studentAAA.setName(
new String("Student AAA"));
studentAAA.setAge(
15);
studentAAA.setTeacher(techarAAA);

System.out.println(
"学生复制前studentAAA:" + studentAAA);
try {
Student studentCopy
= (Student) studentAAA.clone();
Teacher teacherCopy
= studentCopy.getTeacher();
studentCopy.setName(
new String("Student BBB"));
studentCopy.setAge(
20);
teacherCopy.setName(
"Teacher BBB");
teacherCopy.setAge(
45);
studentCopy.setTeacher(teacherCopy);
System.out.println(
"学生复制后studentAAA:" + studentAAA);
System.out.println(
"学生复制后studentCopy:" + studentCopy);
}
catch (CloneNotSupportedException e) {
e.printStackTrace();
}

}

}

以上深copy主要通过各层浅copy实现.

真正完整深copy可通过序列化的方式.