`
sulifeng
  • 浏览: 41124 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

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/

 

分享到:
评论

相关推荐

    Java教程中文版

    - **数组拷贝**:探讨数组复制的方法,包括浅拷贝和深拷贝的区别。 - **数组应用案例**:通过实例展示数组在解决具体问题中的应用。 以上是基于给定的文件信息整理出的Java教程中文版的关键知识点概览。这些知识...

    java面试笔记整理,包含java,redis,kafka等

    - **深拷贝与浅拷贝的选择取决于具体需求。 #### 四十、同步与异步的区别 - **同步:** 直到一个操作完成才会继续执行下一个操作。 - **异步:** 可以同时处理多个操作,某个操作完成后通知调用者。 #### 四十一、...

    Java面试宝典

    如果需要深拷贝,则需要显式地复制对象的所有字段。 - 另一种方式是使用序列化机制,即将对象序列化为字节流再反序列化。 **13. 一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?** - 这个...

    2011年最全Java面试题

    `clone()`方法用于创建对象的浅拷贝,但对于包含可变对象成员的情况,需要手动实现深拷贝,以确保独立的对象副本。 ### 18. 字符串不可变性与字符串池 `String`类在Java中是不可变的,这意味着一旦创建,其内容不...

    计算机类基础问题

    - 浅拷贝仅复制对象的引用,原对象改变时副本也会受到影响。 6. **虚析构函数**:如果一个类作为基类且可能会被继承,推荐将析构函数声明为虚函数,以确保正确地释放派生类的对象。 7. **面向对象的特性**:封装...

    Java分配

    6. **深拷贝与浅拷贝**:在对象复制时,浅拷贝只是复制了对象的引用,而深拷贝会创建一个新的对象并复制所有字段。Java中,深拷贝通常通过序列化和反序列化或手动复制每个字段来实现。 7. **final关键字与赋值**:...

    深入理解 python1

    Python中的赋值操作并不像C++或Java那样复制对象,而是创建了一个对已有对象的引用。这意味着当你为一个变量赋予一个列表或其他复合类型的值时,你实际上是在为该变量创建一个指向同一对象的引用,而不是创建一个新...

    jAVA编程规范J2EE代码规范

    - 实现`Cloneable`接口并重写`clone()`方法以支持对象的深拷贝或浅拷贝。 9. **2.9 类方法** - 提供静态方法来执行不依赖于类实例的操作。 10. **2.10 toString方法** - 重写`toString()`方法以提供类实例的...

    中级程序员必备面试题.txt

    - **深拷贝**:完全复制对象的所有属性,包括引用类型的属性也会递归复制。 实现方式包括: - **序列化方式**。 - **反射方式**。 - **克隆方式**。 #### `equals`与`==`的区别 - `==`:比较两个变量或对象引用...

Global site tag (gtag.js) - Google Analytics