java的传值与传引用
java的传值与传引用
java中,基本数据类型都是传值,比如int,double,lang,
java中,对象都是传引用,
特例,String对象是传值操作
=赋值操作是传引用操作
克隆分为影子克隆和深克隆
new出一个新的对象a1,在内存中开辟出一块新的区域给a1使用。
new出一个新的对象a1,在内存中开辟出一块新的区域给a1使用。同时,将a1赋值给a2,这时,也会分配内存给a2,但是a2存放的不是与a1一样的对象,而是指向a1的指针,或者说a2是a1的引用。

一个很直接的克隆例子,先new一个a1出来,然后使用a1克隆的方法给a2赋值,这是内存会分配两个区域给a1和a2分别使用,二者互不相干。
下面来说说影子克隆与深度克隆
所以影子克隆与深度克隆一个主要的区别就在于,如果一个对象A里的成员变量B是另外一个对象,影子克隆只是克隆出一份A,但是克隆出来的A里面的B还是一个指向原来A中的一个指针,而深度克隆就是出来的A中的B也是一个新的B,与原来A中的B互不相干,说的有些绕口,下面来看图。
先假定咱们有如下的class:
class B {……}
class A { B b;}
A中的一个成员变量b是B对象。

这张图说明的是影子克隆,影子克隆的结果就是a1与a2分配出了一块内存区域,b1分配出了一块内存区域,b2也是占用了内存区域,但是它是指向b1的一个指针,对b2进行改变会影响到b1跟着改变。

恩,这张图说明的就是深度克隆了,给b2分配了内存,但是这时不是指向b1的一个指针了,而是实实在在的B b2对象,对b2的改变与b1没有关系。
java的深度克隆与影子克隆的实现方法,可以参考下面的资料。
参考资料:
Java基本功——Reference
http://dreamhead.blogbus.com/logs/2005/05/1189478.html
JAVA中的指针,引用及对象的clone
http://www.ibm.com/developerworks/cn/java/l-jpointer/index.html
Leave a Message
No Messages
RSS feed for comments on this post. TrackBack URI


我的简介: 谁说tmd巨蟹座傻来的?我就是tmd巨蟹里边儿最聪明的!!!