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调用样例java

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实现.ide

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

相关文章
相关标签/搜索