黑马程序员技术交流社区

标题: 什么是深复制和浅复制? [打印本页]

作者: 寥若星辰    时间: 2012-12-21 18:37
标题: 什么是深复制和浅复制?
什么是深复制和浅复制?
作者: hanyahui    时间: 2012-12-21 19:01
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而其所有的对其他对象的引用都仍然指向原来的对象。
深复制:被复制对象会将所有非引用类型的字段复制给新对象,同时将引用类型所指向地址中存的对象复制给新的对象。

作者: 婂埖糖    时间: 2012-12-21 19:25
浅复制将一个对象复制之后,生成一个新的对象,新对象的所有成员变量(基本类型或引用类型)都含有与原有对象相同的值,如果原有对象的成员变量是基本数据类型,就会将这个变量的值拷贝一份到新对象里面,如果原有对象的成员变量是引用数据类型,那么这个引用指向的对象不会新生成一份,而是,在新对象里面的这个引用跟原有对象的引用指向的是同一个对象。深复制将一个对象复制之后,生成一个新的对象,新对象的基本数据类型变量含有与原有对象相同的值,如果原有对象的成员变量是引用数据类型,在新对象里面,这些引用变量将指向被复制过的新对象,而不再是指向原有的那些被引用的对象,深复制把要复制的对象所引用的对象都复制一遍。

例子:
class A {
public int i; public int j;
}
A a = new A();
浅拷贝: A a1 = a;
深拷贝:
A a1 = new A();
a1.i = a.i; a1.j = a.j;
如上所示: 浅拷贝只拷贝对象本身 深拷贝则拷贝对象中引用的对象,一直拷贝下去。

作者: 张向阳    时间: 2012-12-21 19:43
  1. namespace _02深拷贝和浅拷贝
  2. {
  3. class MyClass1//声明类1
  4. {
  5. public string name;//里面设一个字段,注意:string为引用类型!
  6. }
  7. class MyClass2//声明类2
  8. {
  9. public int num;
  10. public MyClass1 Mc;//将类1作为类2的一个字段
  11. }
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. MyClass2 mc1 = new MyClass2();//类2首先实例化一个mc1
  17. mc1.num = 100;
  18. mc1.Mc = new MyClass1();//这里new一个类1的实例
  19. mc1.Mc.name = "黑马";//给name赋值!
  20. //------------------------------------------------------
  21. MyClass2 mc2 = new MyClass2();//new一个mc2实例
  22. mc2.num = mc1.num;//将实例1中num的值直接拷贝给了实例2的num;
  23. mc2.Mc = new MyClass1();//再new一个类1的实例
  24. mc2.Mc.name = mc1.Mc.name;//这样相当于将name中的值直接复制过来,属于深拷贝!
  25. //-------------------------------------------------------
  26. MyClass2 mc3 = new MyClass2();
  27. mc3.num = mc1.num;//值类型的拷贝都没什么区别
  28. mc3.Mc = mc1.Mc;//区别就在这儿,这样的拷贝相当于只是mc3.Mc指向发生了改变,只是复制了地址,没有将name中的值真正拷贝过来!

  29. //例子不好理解的话,可以简单认为深拷贝是将文件整个复制过来,而浅拷贝只是复制了快捷方式!希望对你有帮助!
  30. }
  31. }
  32. }
复制代码

作者: 王靖雯    时间: 2012-12-22 19:48
浅复制的话如果你改变其中一个对象的数据,那么另一个对象里的也会改变,他们的内存是同一块。而深层复制的话,两个对象内容一样,但是是在两个不同区域存储着,改变其中一个对象中的值不会影响另一对象中的值




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2