java深copy (伪深copy)【原】

java

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可通过序列化的方式.

以上是 java深copy (伪深copy)【原】 的全部内容, 来源链接: utcz.com/z/393873.html

回到顶部