笑着 胖胖兰原创,转载请注明。
http://blog.csdn.net/bluesmile979/archive/2008/10/24/3136405.aspx
拷贝一般来说我们是用不到的,关于深拷贝浅拷贝网上的讨论也挺多的。就是一个具体的问题,任何一个独立的讨论这个问题的文章基本也都把这个事情说清楚了。这里为了尽量保证笑着的文章的完整性,还是多少写一点吧。就画个图,大家一看就明白了。
假定我们要对一个对象BC做拷贝,生成一个新的对象AC。BC这个对象里面除了基本数据类型的属性之外,还有一个对象BIC属性。我们来看一下拷贝的时候内存的状况
内存区M1 int f1 Boolean f2 XXClass BIC …… ….. …… |
内存区M2 Float …. String …. ….. …….. …….. …… |
Clone前
BC |
Clone后
AC
|
对内存区M1拷贝残生的新的内存区M3 int f1 Boolean f2 XXClass BIC …… ….. …… |
看明白了么?当我们对BC这个对象做拷贝的时候,Java默认会新建一个内存区,把BC志向的内存区M1中的内容全部拷贝到新建的内存区M3中,但是对于BC中的对象BIC来说,M1中保存的知识BIC这个对象的保存地址,所以我们拷贝到M3中的BIC只是拷贝了一份地址,BIC在拷贝前,靠背后都是指向同一个内存区域M2。这就是所谓的浅拷贝。如果我们需要把内存区域M2中的内容也拷贝到一个新的内存区域中,比如说M4,那么我们需要多做一些事情,比如在clone方法里面明确的写出,BIC =new BIC();并对其字段作初始设定,或者BIC=BIC.clone 这就是所谓的深拷贝。
看上面的图可以看出来,浅拷贝之后,AC,BC会操作同一块内存区M3,这样就导致了对象内容可以通过AC,BC来更改,这里就有信息安全性,完整性,同步等等问题会出现。恩,很简单吧。不多说了,浪费我们的时间。