读书人

java复合对象的复制有关问题(浅拷贝和

发布时间: 2012-12-20 09:53:21 作者: rapoo

java复合对象的复制问题(浅拷贝和深拷贝)

????????? 今天遇到了个奇怪的问题,郁闷了好一会儿,原因是我的基础太差,基本概念也不了解.
?? 事情是这样的, 举个小例子,比如说:

  int a=3;  int b=a;  b=4;   System.out.println("a="a);


???????? 显然应该打印"a=3". 尽管b是a的复制,对b作的改变仍然不会影响到a.
??????? ?对于int这样的简单类型是这样,但对于复合对象恐怕不不是了.
???????? 对于下面的代码:

 Stack stack1=new Stack();stack1.push(1);stack1.push(2);stack1.push(3);stack1.push(4);        Stack stack2=stack1;        System.out.println("stack2做一次pop前的stack1:"+stack1);    stack2.pop();    System.out.println("stack2做一次pop后的stack1:"+stack1);     



????????? 正确的打印结果是:

stack2做一次pop前的stack1:[1, 2, 3, 4]stack2做一次pop后的stack1:[1, 2, 3]


??????? ?刚看到这个运行结果时我郁闷的不行.显然stack1一旦把自己复制给别人,stack2和stack1操纵的就是同一份对象了. 多个变量竟然能够同时操纵同一个对象,虽然这貌似是java里的常识.基础差的我难怪要大惊小怪.唉.
?????? ?如果想实现每个变量都各自操纵自己的Stack对象,一个方法是使用clone方法,将上面代码中的赋值语句改成这样:

Stack stack2=(Stack)stack1.clone();


???????? 具体原因现在我才知道,大概就是深拷贝和浅拷贝的问题.
??????? ?Stack类里的clone函数介绍:

public Object clone()      返回向量的一个副本。副本中将包含一个对内部数据数组副本的引用,而非对此 Vector 对象的原始内部数据数组的引用。 覆盖:     类 Object 中的 clone返回:     向量的一个副本另请参见:     Cloneable



??????? 待参考资料:
???? http://www.iteye.com/topic/483469??
???? http://syue.com/Software/JAVA/15617.html

???? http://chenkegarfield.blog.163.com/blog/static/623300082010101594154119/

?

读书人网 >编程

热点推荐