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

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/