java深copy (伪深copy)【原】

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

原文地址:https://www.cnblogs.com/whatlonelytear/p/8361723.html