Java中的深克隆和浅克隆(Clone)

打印 上一主题 下一主题

主题 927|帖子 927|积分 2781

浅克隆(shallow clone)和深克隆(deep clone)是两种不同的对象复制方法。
浅克隆会创建一个新对象,然后将原始对象的所有字段复制到新对象中。如果字段是基本类型,则它们的值将被直接复制。如果字段是引用类型,则只会复制引用,而不会复制引用指向的对象。这意味着原始对象和克隆对象中的引用类型字段将指向同一个对象。
深克隆不仅会复制原始对象的所有字段,还会递归地复制引用类型字段指向的所有对象。这意味着原始对象和克隆对象中的引用类型字段将指向不同的对象。


 
 
 
在Java中,要实现对象的浅克隆和深克隆,可以让你的类实现Cloneable接口,并重写Object类中的clone方法。
浅克隆可以通过调用super.clone()方法来实现。这将创建一个新对象,并将原始对象的所有字段复制到新对象中。如果字段是基本类型,则它们的值将被直接复制。如果字段是引用类型,则只会复制引用,而不会复制引用指向的对象。
深克隆需要手动实现。需要在clone方法中创建一个新对象,并递归地复制所有引用类型字段指向的对象。
下面是一个示例类,它演示了如何实现浅克隆和深克隆:
  1. 1 public class MyClass implements Cloneable {
  2. 2     private int x;
  3. 3     private int[] y;
  4. 4
  5. 5     public MyClass(int x, int[] y) {
  6. 6         this.x = x;
  7. 7         this.y = y;
  8. 8     }
  9. 9
  10. 10     public int getX() {
  11. 11         return x;
  12. 12     }
  13. 13
  14. 14     public int[] getY() {
  15. 15         return y;
  16. 16     }
  17. 17
  18. 18     @Override
  19. 19     public MyClass clone() throws CloneNotSupportedException {
  20. 20         MyClass clone = (MyClass) super.clone();
  21. 21         // Deep clone the y array
  22. 22         clone.y = y.clone();
  23. 23         return clone;
  24. 24     }
  25. 25 }
复制代码
在这个示例中,我们定义了一个名为MyClass的类,它包含两个字段:一个整型字段x和一个整型数组字段y。我们让这个类实现了Cloneable接口,并重写了clone方法。
在clone方法中,我们首先调用了super.clone()方法来执行浅克隆。然后,我们对整型数组字段y执行了深克隆,即通过调用它的clone方法来创建一个新的数组。
要使用这个类来创建浅克隆和深克隆对象,可以这样写:
  1. int[] y = {1, 2, 3};
  2. MyClass original = new MyClass(10, y);
  3. MyClass shallowClone = original.clone();
  4. MyClass deepClone = original.clone();
  5. System.out.println("Original: " + original.getX() + ", " + Arrays.toString(original.getY()));
  6. System.out.println("Shallow clone: " + shallowClone.getX() + ", " + Arrays.toString(shallowClone.getY()));
  7. System.out.println("Deep clone: " + deepClone.getX() + ", " + Arrays.toString(deepClone.getY()));
  8. y[0] = 100;
  9. System.out.println("After modifying the original object:");
  10. System.out.println("Original: " + original.getX() + ", " + Arrays.toString(original.getY()));
  11. System.out.println("Shallow clone: " + shallowClone.getX() + ", " + Arrays.toString(shallowClone.getY()));
  12. System.out.println("Deep clone: " + deepClone.getX() + ", " + Arrays.toString(deepClone.getY()));
复制代码
在这个示例中,我们创建了一个原始对象original,然后使用它的clone方法创建了两个克隆对象:一个浅克隆对象和一个深克隆对象。接下来,我们修改了原始对象中的整型数组字段。
运行这段代码,将看到以下输出:
  1. Original: 10, [1, 2, 3]
  2. Shallow clone: 10, [1, 2, 3]
  3. Deep clone: 10, [1, 2, 3]
  4. After modifying the original object:
  5. Original: 10, [100, 2, 3]
  6. Shallow clone: 10, [100, 2, 3]
  7. Deep clone: 10, [1, 2, 3]
复制代码
从输出中可以看出,对原始对象的修改影响到了浅克隆对象,但没有影响到深克隆对象。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王海鱼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表