通过Object类中的clone()方法 可以克隆出一个对象
    protected native Object clone() throws CloneNotSupportedException;

    想克隆必须要实现Cloneable接口(不然运行时会抛出CloneNotSupportedException异常)
    然后重写clone方法,不然实现类无法直接调用clone()方法(因为protected修饰的)

    根据克隆得到的对象分为 深克隆和浅克隆 / 深拷贝和浅拷贝

    浅克隆
    只克隆对象本身 不克隆对象中所引用的其他对象
    Student类:

    1. public class Student implements Cloneable{
    2. private String name;
    3. private int age;
    4. private Teacher teacher;
    5. public Student(String name, int age, Teacher teacher) {
    6. this.name = name;
    7. this.age = age;
    8. this.teacher = teacher;
    9. }
    10. public String getName() {
    11. return name;
    12. }
    13. public void setName(String name) {
    14. this.name = name;
    15. }
    16. public int getAge() {
    17. return age;
    18. }
    19. public void setAge(int age) {
    20. this.age = age;
    21. }
    22. public Teacher getTeacher() {
    23. return teacher;
    24. }
    25. public void setTeacher(Teacher teacher) {
    26. this.teacher = teacher;
    27. }
    28. @Override
    29. public Object clone() throws CloneNotSupportedException {
    30. return super.clone();
    31. }
    32. }

    Teacher类:

    1. import java.util.concurrent.ConcurrentHashMap;
    2. import java.util.concurrent.CountDownLatch;
    3. import java.util.concurrent.locks.ReentrantReadWriteLock;
    4. public class Teacher{
    5. private String name;
    6. private int age;
    7. public Teacher(String name, int age) {
    8. this.name = name;
    9. this.age = age;
    10. }
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. public int getAge() {
    18. return age;
    19. }
    20. public void setAge(int age) {
    21. this.age = age;
    22. }
    23. }

    深克隆
    既克隆对象本身 又克隆对象中所引用的其他对象
    Student类:

    1. public class Student implements Cloneable{
    2. private String name;
    3. private int age;
    4. private Teacher teacher;
    5. public Student(String name, int age, Teacher teacher) {
    6. this.name = name;
    7. this.age = age;
    8. this.teacher = teacher;
    9. }
    10. public String getName() {
    11. return name;
    12. }
    13. public void setName(String name) {
    14. this.name = name;
    15. }
    16. public int getAge() {
    17. return age;
    18. }
    19. public void setAge(int age) {
    20. this.age = age;
    21. }
    22. public Teacher getTeacher() {
    23. return teacher;
    24. }
    25. public void setTeacher(Teacher teacher) {
    26. this.teacher = teacher;
    27. }
    28. @Override
    29. public Object clone() throws CloneNotSupportedException {
    30. //深克隆 同时克隆Teacher 得到了一个新的Teacher对象 该对象的引用和原有Student对象中的Teacher引用已经不是同一个了
    31. Student cloneStudent = (Student) super.clone();
    32. Teacher cloneTeacher = (Teacher) cloneStudent.getTeacher().clone();
    33. cloneStudent.setTeacher(cloneTeacher);
    34. return cloneStudent;
    35. }
    36. }

    Teacher类:

    1. import java.util.concurrent.ConcurrentHashMap;
    2. import java.util.concurrent.CountDownLatch;
    3. import java.util.concurrent.locks.ReentrantReadWriteLock;
    4. public class Teacher implements Cloneable{
    5. private String name;
    6. private int age;
    7. public Teacher(String name, int age) {
    8. this.name = name;
    9. this.age = age;
    10. }
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. public int getAge() {
    18. return age;
    19. }
    20. public void setAge(int age) {
    21. this.age = age;
    22. }
    23. @Override
    24. public Object clone() throws CloneNotSupportedException{
    25. return super.clone();
    26. }
    27. }

    主函数:

    1. public class TestMain {
    2. public static void main(String[] args) throws CloneNotSupportedException {
    3. Teacher teacher = new Teacher("zhangsan", 18);
    4. Student student = new Student("lisi", 16, teacher);
    5. Student cloneStudent = (Student) student.clone();
    6. System.out.println(cloneStudent.getName());
    7. System.out.println(cloneStudent.getAge());
    8. System.out.println(cloneStudent.getTeacher().getName());
    9. System.out.println(cloneStudent.getTeacher().getAge());
    10. // 更改克隆对象 的老师名字和年纪
    11. cloneStudent.getTeacher().setName("zzt");
    12. cloneStudent.getTeacher().setAge(17);
    13. // 查看 原对象 的老师名字和年纪 是否被更改
    14. System.out.println(student.getTeacher().getName());
    15. System.out.println(student.getTeacher().getAge());
    16. }
    17. }

    浅克隆结果:
    _WL(S$SB53LHFEHPO3WYA9F.png
    此时得到的对象与原对象都引用了同一个Teacher对象 即为浅克隆
    深克隆结果:
    `Y8)3E}UL1{6CAC(Y(FFA6W.png
    此时得到的对象与原对象引用的不是同一个Teacher对象 即为深克隆