通过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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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对象 即为深克隆
