`
avaj
  • 浏览: 234373 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

今天工作中碰到一个clone的问题

阅读更多
今天开发中遇到一个问题:

需要将一个对象进行clone,对他的副本的属性进行修改,供一个特定的对象使用,完成某个需求。

平时对java的clone看的不是很多,相当然的使用了Object的clone()方法:

SomObject obj = new SonObject();


SomObject objClone =obj.clone();

结果发现更新obj的某个成员变量的时候(ArrayList),objClone中的成员变量也相应的发生变化!但是obj.hashCode() 却不等于objClone.hashCode(),说明他们并没有指向同一个对象!看到这个结果一下子蒙了,这是为什么呢??

仔细想了一下,恍然大悟:java中的clone是浅拷贝,只是拷贝对象本身,以及基本数据类型,对于对象的非基本数据类型变量,比如ArrayList等,并不进行拷贝!

---------
java 代码
 
  1. public class SomObject implements Cloneable{  
  2.   
  3.     private List wifeList;  
  4.   
  5.     private int count;  
  6.   
  7.     ....  
  8.   
  9.     public Object clone(){  
  10.         try{  
  11.             return super.clone();  
  12.         }catch(....){  
  13.             ....  
  14.         }  
  15.         return null;  
  16.     }  
  17. }  
  18.   
  19. SomObject obj = new SomObject();  
  20.   
  21. obj.setCount(1);  
  22. obj.setWifeList(new ArrayList("Beautifule"));  
  23.   
  24. SomObjec cloneObj = (SomObject)obj.clone();  
  25.   
  26. obj.setCount(2);  
  27. obj.setWifeList(new ArrayList("Tender"));  
  28.   
  29. System.out.println(obj.getCount());//结果 2  
  30. System.out.println(obj.getWifeList().get(0));//Tender  
  31.   
  32.   
  33. System.out.println(cloneObj.getCount());//结果 1  
  34. System.out.println(cloneObj.getWifeList().get(0));//Tender  

分享到:
评论

相关推荐

    as3场景中MC复制一个或多个

    说明:这个是用来实现已在场景中的Mc复制多个出来,如AS2中可以duplicateMovieClip,AS3...本人就遇到这个问题了,做一个上传图片的系统,当用户要复制操作时就不行,下面是以构造器方法自己做出的方法,望能帮到大家

    React-Insta-Clone

    React-Insta-Clone 介绍 这个项目的目的是继续利用您到目前为止所获得的React知识。 ... 目标是完成每一天的目标,并在第二天开始一个工作项目。 如果您没有实现日常目标,也不要惊慌,那么某些日

    virtualenv-clone:用于克隆不可重定位的virtualenv的脚本。 起源于这里

    virtualenv克隆脚本。 用于克隆不可重定位的virtualenv的脚本。... ( --relocatable不会碰到这个) 如果bin中的各种脚本指向旧的Python,请将它们的shebang更新为新的Python。 (版本编号保留。) 它也可以将

    Insta-Clone-

    项目3- Insta-Clone Insta-Clone是类似于Instagram照片共享应用程序,但使用Parse作为后端。 花费时间:总共花费5个小时用户故事完成以下必需的功能: 用户可以注册以使用解析身份验证创建新帐户。 用户可以登录和...

    从一个“普通”的Oracle DBA(Oracle数据库管理员)转变为Oracle Applications DBA(Oracle应用程序数据库管理员)

    最后,我要说,你现在接触和管理的是比你以前复杂的多的系统,这套系统的每一个部分都不能单独来看,一叶障目,不见泰山,遇到问题应该从整体思考。一个Apps DBA是一个对这套系统每一部分都有所了解的人。 结论 ...

    github创建仓库及gitbash代码管理

    及搭建环境过程中常遇到的问题的解决方案,第一次搭建常遇到的问题: 使用git clone xxx 指令下载仓库到本地是可能遇到如下问题: fatal: unable to access '...

    zapatos-example:这是一个示例项目,旨在演示在尝试将Zapatos与导出为在另一个软件包中使用的数据库模块一起使用时遇到的问题

    这是一个示例项目,目的是演示试图将与导出为在另一个软件包中使用的数据库模块一起使用时遇到的问题。 入门 这些说明将为您提供在本地计算机上运行并运行的项目的副本,以进行开发和测试。 先决条件 您需要先安装...

    cargo_clone:货运公司克隆(演示)

    YurtiçiCargo的一个简单副本。 土耳其的一家货运公司。 Github文件还包括前端和json文件。 您可以在heroku上实时预览应用... :closed_mailbox_with_raised_flag: 有一个问题? 想聊天? 遇到问题了吗? 网站 我的 帐号

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    2.3.1 在Eclipse中创建自己的第一个项目 28 2.3.2 在Eclipse中编写HelloWorld程序 29 2.3.3 通过Eclipse运行Hello World 31 2.4 小结:Eclipse——功能很强大 32 2.5 习题 32 第3章 Java中的基本数据类型和...

    arcade-game-clone:Frogger游戏克隆

    街机游戏克隆该项目包含一个网页,用户可以在其中播放街机经典Frogger的版本。 用户必须在提供的游戏板网格上导航他们的角色,而不会与在屏幕上移动的任何bug发生冲突。 当用户到达水面时,游戏就赢了。 如果用户在...

    二十三种设计模式【PDF版】

    一个熟悉这些模式的设计者不需要再去发现它们,而能够立即将它们应用于设计问题中。以下类比可以帮助说明这一点。 小说家和剧本作家很少从头开始设计剧情。他们总是沿袭一些业已存在的模式,像“悲剧性英雄”模式(...

    三分钟编译支持NTFS的Linux系统模块

    当你安装完Linux系统,并且已经启动,如果你的硬盘上还安装了WinNT/2000系统,你试图去访问另一个NTFS分区时却遇到了麻烦。因为你所用的Linux系统没有已编译的支持NTFS文件系统的模块。怎么办?也许你会运行make ...

    java面试宝典

    22、我们在web 应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 10 23、String 和StringBuffer 的区别? 10 24、String, StringBuffer StringBuilder 的区别。 10 25、...

    jlink V8固件烧录教程及工具,刷后可在keil v5正常使用

    本资源主要解决JLINK V8 在keil v5中不能使用的问题,使用官方驱动后报各种错误,如果你在使用中遇到如下3种报错: 1、The connected J-Link is clone.... 2、the connected j-link is defective.... 3、the ...

    java 面试题 总结

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    专营权::french_fries:笔记本sql客户端。 有很多续集时会得到什么

    要连接到PostgreSQL , MySQL或BigQuery ,只需在终端中运行一个命令打开一个桥,该桥就可以让Franchise直接连接到您的数据库。 您的数据永远不会碰到第三方服务器。 只需单击一下图表 并排比较查询 使用我们,您...

    arcgis工具

    使用一个属性字段作为超链 在内容表中右击包含一个超链接字段的图层,然后点击properties ,单击Display选项卡。选中Supprt Hyper3. Hyperlinks using field选项,单击下拉箭头并点击一个字段。 单击Document or URL...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    2.3.1 在Eclipse中创建自己的第一个项目 28 2.3.2 在Eclipse中编写HelloWorld程序 29 2.3.3 通过Eclipse运行Hello World 31 2.4 小结:Eclipse——功能很强大 32 2.5 习题 32 第3章 Java中的基本数据类型和...

    C++ QT SMTP 发送邮件(最新,成功的)

    之前在CSDN中,也尝试了很多发送邮件的代码,总是遇到各种各样的问题, 现在找到了这个好东东,和大家分享一下,只要简单配置下,就可以发送邮件了 配置内容 1. 指定 SMTP的服务器 2. 指定发件人的用户名(一般都是...

Global site tag (gtag.js) - Google Analytics