通过Object类中的clone()方法 可以克隆出一个对象
protected native Object clone() throws CloneNotSupportedException;
想克隆必须要实现Cloneable接口(不然运行时会抛出CloneNotSupportedException异常)
然后重写clone方法,不然实现类无法直接调用clone()方法(因为protected修饰的)
根据克隆得到的对象分为 深克隆和浅克隆 / 深拷贝和浅拷贝
浅克隆
只克隆对象本身 不克隆对象中所引用的其他对象
Student类:
public class Student implements Cloneable{
private String name;
private int age;
private Teacher teacher;
public Student(String name, int age, Teacher teacher) {
this.name = name;
this.age = age;
this.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 Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Teacher类:
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class Teacher{
private String name;
private int age;
public Teacher(String name, int age) {
this.name = name;
this.age = 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;
}
}
深克隆
既克隆对象本身 又克隆对象中所引用的其他对象
Student类:
public class Student implements Cloneable{
private String name;
private int age;
private Teacher teacher;
public Student(String name, int age, Teacher teacher) {
this.name = name;
this.age = age;
this.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 Object clone() throws CloneNotSupportedException {
//深克隆 同时克隆Teacher 得到了一个新的Teacher对象 该对象的引用和原有Student对象中的Teacher引用已经不是同一个了
Student cloneStudent = (Student) super.clone();
Teacher cloneTeacher = (Teacher) cloneStudent.getTeacher().clone();
cloneStudent.setTeacher(cloneTeacher);
return cloneStudent;
}
}
Teacher类:
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class Teacher implements Cloneable{
private String name;
private int age;
public Teacher(String name, int age) {
this.name = name;
this.age = 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 Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
主函数:
public class TestMain {
public static void main(String[] args) throws CloneNotSupportedException {
Teacher teacher = new Teacher("zhangsan", 18);
Student student = new Student("lisi", 16, teacher);
Student cloneStudent = (Student) student.clone();
System.out.println(cloneStudent.getName());
System.out.println(cloneStudent.getAge());
System.out.println(cloneStudent.getTeacher().getName());
System.out.println(cloneStudent.getTeacher().getAge());
// 更改克隆对象 的老师名字和年纪
cloneStudent.getTeacher().setName("zzt");
cloneStudent.getTeacher().setAge(17);
// 查看 原对象 的老师名字和年纪 是否被更改
System.out.println(student.getTeacher().getName());
System.out.println(student.getTeacher().getAge());
}
}
浅克隆结果:
此时得到的对象与原对象都引用了同一个Teacher对象 即为浅克隆
深克隆结果:
此时得到的对象与原对象引用的不是同一个Teacher对象 即为深克隆