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