Java中的克隆close()和赋值引用的区别

以你之姓@ 2022-08-05 01:30 152阅读 0赞

学生类Student:

  1. package 克隆clone;
  2. /*要克隆必须实现这个借口:Cloneable,以标记这个对象可以克隆
  3. Cloneable:此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。
  4. 这个接口是标记接口,告诉我们实现该接口的类就可以实现对象的复制了。
  5. */
  6. public class Student implements Cloneable {
  7. private String name;
  8. private int age;
  9. public Student() {
  10. }
  11. public Student(String name, int age) {
  12. super();
  13. this.name = name;
  14. this.age = age;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public int getAge() {
  23. return age;
  24. }
  25. public void setAge(int age) {
  26. this.age = age;
  27. }
  28. // 重写克隆方法子列才可以调用
  29. @Override
  30. protected Object clone() throws CloneNotSupportedException {
  31. return super.clone();
  32. }
  33. }

测试克隆学生类:

  1. package 克隆clone;
  2. /*
  3. * protected void finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。用于垃圾回收,但是什么时候回收不确定。
  4. * protected Object clone():创建并返回此对象的一个副本。
  5. * A:重写该方法
  6. *
  7. * Cloneable:此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。
  8. * 这个接口是标记接口,告诉我们实现该接口的类就可以实现对象的复制了。
  9. */
  10. public class StudentClone {
  11. public static void main(String[] args) throws CloneNotSupportedException {
  12. //创建学生对象
  13. Student s = new Student();
  14. s.setName("林青霞");
  15. s.setAge(27);
  16. //克隆学生对象
  17. Object obj = s.clone();
  18. Student s2 = (Student)obj;
  19. System.out.println("---------");
  20. System.out.println(s.getName()+"---"+s.getAge());
  21. System.out.println(s2.getName()+"---"+s2.getAge());
  22. //以前的做法
  23. Student s3 = s;
  24. System.out.println(s3.getName()+"---"+s3.getAge());
  25. System.out.println("---------");
  26. //其实是有区别的
  27. s3.setName("刘意");
  28. s3.setAge(30);
  29. System.out.println(s.getName()+"---"+s.getAge());
  30. System.out.println(s2.getName()+"---"+s2.getAge());
  31. System.out.println(s3.getName()+"---"+s3.getAge());
  32. System.out.println("---------");
  33. //把克隆的改一下呢?
  34. s2.setName("克隆改的名称");
  35. s2.setAge(66);
  36. System.out.println(s.getName()+"---"+s.getAge());
  37. System.out.println(s2.getName()+"---"+s2.getAge());
  38. System.out.println(s3.getName()+"---"+s3.getAge());
  39. //也就是说把一个对象的引用赋值给一个引用,当这个引用发什么该改变的时候,同一个引用指向的对象会发生改变,但是克隆的不会变化,
  40. //把克隆的对象改变他的一些属性,那么也不会影响到其他的对象的值的改变
  41. }
  42. }

发表评论

表情:
评论列表 (有 0 条评论,152人围观)

还没有评论,来说两句吧...

相关阅读