JAvaのクローン

2714 ワード

レプリケーションとは、1つのものを1つコピーすることで、javaには浅いレプリケーションと深いレプリケーションの概念があります.
浅いレプリケーションとは、レプリケーションされたオブジェクトが元のオブジェクトと同じメンバー変数値を持つことを意味しますが、その参照タイプの変数は同じです.
1つのオブジェクトであり、深いレプリケーションは元のオブジェクトとそのメンバー変数を参照するオブジェクトもレプリケーションされます.
レプリケーションの条件は次のとおりです.
まずCloneableインタフェースを実装するには、Objectクラスのcloneメソッドを書き換え、protect修飾子をpublicに変更し、Objectクラスのcloneメソッドsuper.clone()を呼び出します.
なぜsuper.clone()を呼び出さなければならないのかと聞かれるかもしれません.
実行時、Objectのcloneメソッドは、コピーするオブジェクトを特定し、そのオブジェクトに空を割り当てます.
オブジェクトのコピーを行い、元のオブジェクトの内容を新しいオブジェクトのストレージスペースにコピーします.
以下に、深いレプリケーションの例を示します.

package com.lamp.test;

public class CloneTest {
	public static void main(String[] args) throws Exception {
		Teacher teacher = new Teacher();
		teacher.setAge(50);
		teacher.setName("   ");
		
		Student student = new Student();
		student.setAge(22);
		student.setName("zhansan");
		student.setTeacher(teacher);
		
		Student student2 = (Student)student.clone();
		student2.getTeacher().setName("   ");		//      ,     teacher          student   
		System.out.println(student2.getName());
		System.out.println(student.getTeacher().getName());
	}
}

class Student implements Cloneable {
	private int age;

	private String name;

	private 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;
	}

	public Teacher getTeacher() {
		return teacher;
	}

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

	@Override
	public Object clone() throws CloneNotSupportedException {	//  Object clone  ,    protect     public
		Student student = (Student) super.clone();
		student.setTeacher((Teacher) student.getTeacher().clone());		

//  Object clone    ,            ,              
		return student;
	}
}

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;
	}

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

}