java原型模式-克隆方法
浅克隆
被复制对象的变量与原对象值相同,浅克隆仅仅复制拷贝的对象,但不复制他所引用的对象深克隆
在浅克隆的基础上,那些引用其他对象的变量指向了复制过的新对象,深克隆把复制对象的引用对象也都复制了一遍
下例
- 创建学生类,学生私有属性id,name,age
- 创建老师类,老师私有属性name
- 创建两者get、set方法
- 老师类实现Cloneable接口,并重写clone()方法为公开方法
- 创建Test类,并重写toString方法来返回对应值。
Teacher类
package Methods_YuanXing;
public class Teacher implements Cloneable{
private String name;
public Teacher(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Teacher(name:" + name + ")";
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Student类
package Methods_YuanXing;
public class Student implements Cloneable{
private String name;
private int id;
private int age;
private Teacher teacher;
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public Student() {
}
public Student(String name, int id, int age) {
this.name = name;
this.id = id;
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student(id:"+id+"+age:" + age + ",name:" + name + ")";
}
@Override
protected Object clone() throws CloneNotSupportedException {
Student s = (Student) super.clone();
s.teacher = (Teacher) teacher.clone();
return s;
}
}
Test主类
package Methods_YuanXing;
import java.util.Arrays;
public class Test {
private static Teacher t = new Teacher("老师");
private static Student s = new Student("学生",1,1);
public static void main(String[] args) {
s.setTeacher(t);
t.setName("老师2");
System.out.println(s);
System.out.println(t);
}
}
测试结果
E:\java_jdk\bin\java.exe
Student(id:1+age:1,name:学生)
Teacher(name:老师2)