Java之路(8)--关于深拷贝浅拷贝(可略过)

 

笑着 胖胖兰原创,转载请注明。

    bluesmile979@hotmail.com

 http://blog.csdn.net/bluesmile979/archive/2008/10/24/3136405.aspx

拷贝一般来说我们是用不到的,关于深拷贝浅拷贝网上的讨论也挺多的。就是一个具体的问题,任何一个独立的讨论这个问题的文章基本也都把这个事情说清楚了。这里为了尽量保证笑着的文章的完整性,还是多少写一点吧。就画个图,大家一看就明白了。

 

假定我们要对一个对象BC做拷贝,生成一个新的对象ACBC这个对象里面除了基本数据类型的属性之外,还有一个对象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来更改,这里就有信息安全性,完整性,同步等等问题会出现。恩,很简单吧。不多说了,浪费我们的时间。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值