黑马程序员技术交流社区
标题:
什么是深复制和浅复制?
[打印本页]
作者:
寥若星辰
时间:
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
namespace _02深拷贝和浅拷贝
{
class MyClass1//声明类1
{
public string name;//里面设一个字段,注意:string为引用类型!
}
class MyClass2//声明类2
{
public int num;
public MyClass1 Mc;//将类1作为类2的一个字段
}
class Program
{
static void Main(string[] args)
{
MyClass2 mc1 = new MyClass2();//类2首先实例化一个mc1
mc1.num = 100;
mc1.Mc = new MyClass1();//这里new一个类1的实例
mc1.Mc.name = "黑马";//给name赋值!
//------------------------------------------------------
MyClass2 mc2 = new MyClass2();//new一个mc2实例
mc2.num = mc1.num;//将实例1中num的值直接拷贝给了实例2的num;
mc2.Mc = new MyClass1();//再new一个类1的实例
mc2.Mc.name = mc1.Mc.name;//这样相当于将name中的值直接复制过来,属于深拷贝!
//-------------------------------------------------------
MyClass2 mc3 = new MyClass2();
mc3.num = mc1.num;//值类型的拷贝都没什么区别
mc3.Mc = mc1.Mc;//区别就在这儿,这样的拷贝相当于只是mc3.Mc指向发生了改变,只是复制了地址,没有将name中的值真正拷贝过来!
//例子不好理解的话,可以简单认为深拷贝是将文件整个复制过来,而浅拷贝只是复制了快捷方式!希望对你有帮助!
}
}
}
复制代码
作者:
王靖雯
时间:
2012-12-22 19:48
浅复制的话如果你改变其中一个对象的数据,那么另一个对象里的也会改变,他们的内存是同一块。而深层复制的话,两个对象内容一样,但是是在两个不同区域存储着,改变其中一个对象中的值不会影响另一对象中的值
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2