当前位置: 首页 > news >正文

北京市网站建设_网站建设公司_页面权重_seo优化

六安论坛网站,陕西网站备案查询,优秀网站推荐,微网站开发费用Java对象的复制三种方式概述在实际编程过程中#xff0c;我们常常要遇到这种情况#xff1a;有一个对象A#xff0c;在某一时刻A中已经包含了一些有效值#xff0c;此时可能 会需要一个和A完全相同新对象B#xff0c;并且此后对B任何改动都不会影响到A中的值#xff0c;也…Java对象的复制三种方式概述在实际编程过程中我们常常要遇到这种情况有一个对象A在某一时刻A中已经包含了一些有效值此时可能 会需要一个和A完全相同新对象B并且此后对B任何改动都不会影响到A中的值也就是说A与B是两个独立的对象但B的初始值是由A对象确定的。例如下面程序展示的情况结果为什么改变学生2的学号学生1的学号也发生了变化呢原因出在(stu2 stu1) 这一句。该语句的作用是将stu1的引用赋值给stu2这样stu1和stu2指向内存堆中同一个对象。如图那么怎么能干干净净清清楚楚地复制一个对象呢。在 Java语言中用简单的赋值语句是不能满足这种需求的。要满足这种需求有很多途径(1)将A对象的值分别通过set方法加入B对象中(2)通过重写java.lang.Object类中的方法clone()(3)通过org.apache.commons中的工具类BeanUtils和PropertyUtils进行对象复制(4)通过序列化实现对象的复制。2.将A对象的值分别通过set方法加入B对象中对属性逐个赋值本实例为了演示简单就设置了一个属性我们发现属性少对属性逐个赋值还挺方便但是属性多时就需要一直get、set了非常麻烦。3.重写java.lang.Object类中的方法clone()先介绍一下两种不同的克隆方法浅克隆(ShallowClone)和深克隆(DeepClone)。在Java语言中数据类型分为值类型(基本数据类型)和引用类型值类型包括int、double、byte、boolean、char等简单数据类型引用类型包括类、接口、数组等复杂类型。浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制下面将对两者进行详细介绍。3.1浅克隆一般步骤1.被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常) 该接口为标记接口(不含任何方法)2.覆盖clone()方法访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象。(native为本地方法)在浅克隆中如果原型对象的成员变量是值类型将复制一份给克隆对象如果原型对象的成员变量是引用类型则将引用对象的地址复制一份给克隆对象也就是说原型对象和克隆对象的成员变量指向相同的内存地址。简单来说在浅克隆中当对象被复制时只复制它本身和其中包含的值类型的成员变量而引用类型的成员对象并没有复制。在Java语言中通过覆盖Object类的clone()方法可以实现浅克隆3.2深克隆怎么两个学生的地址都改变了原因是浅复制只是复制了addr变量的引用并没有真正的开辟另一块空间将值复制后再将引用返回给新对象。为了达到真正的复制对象而不是纯粹引用复制。我们需要将Address类可复制化并且修改clone方法完整代码如下在深克隆中无论原型对象的成员变量是值类型还是引用类型都将复制一份给克隆对象深克隆将原型对象的所有引用对象也复制一份给克隆对象。简单来说在深克隆中除了对象本身被复制外对象所包含的所有成员变量也将复制。在Java语言中如果需要实现深克隆可以通过覆盖Object类的clone()方法实现也可以通过序列化(Serialization)等方式来实现。(如果引用类型里面还包含很多引用类型或者内层引用类型的类里面又包含引用类型使用clone方法就会很麻烦。这时我们可以用序列化的方式来实现对象的深克隆。)4.工具类BeanUtils和PropertyUtils进行对象复制这种写法无论多少种属性都只需要一行代码搞定很方便吧除BeanUtils外还有一个名为PropertyUtils的工具类它也提供copyProperties()方法作用与BeanUtils的同名方法十分相似主要的区别在于BeanUtils提供类型转换功能即发现两个JavaBean的同名属性为不同类型时在支持的数据类型范围内进行转换而PropertyUtils不支持这个功能但是速度会更快一些。在实际开发中BeanUtils使用更普遍一点犯错的风险更低一点。5.通过序列化实现对象的复制序列化就是将对象写到流的过程写到流中的对象是原有对象的一个拷贝而原对象仍然存在于内存中。通过序列化实现的拷贝不仅可以复制对象本身而且可以复制其引用的成员对象因此通过序列化将对象写到一个流中再从流里将其读出来可以实现深克隆。需要注意的是能够实现序列化的对象其类必须实现Serializable接口否则无法实现序列化操作。调用ByteArrayOutputStream或ByteArrayInputStream对象的close方法没有任何意义。这两个基于内存的流只要垃圾收集器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放。修改克隆的Person对象person1关联的汽车对象的品牌属性原来的Person对象person关联的汽车不会受到任何影响因为在克隆Person对象时其关联的汽车对象也被克隆了。基于序列化和反序列化实现的克隆不仅仅时深度克隆更重要的是通过范型限定可以检查出要克隆的对象是否支持序列化这项检查是编译期完成的不是在运行时抛出异常这种方案明显优于使用Object类的clone方法克隆对象。
http://www.ihoyoo.com/news/8247.html

相关文章:

  • 网站全局变量网站建设源程序
  • 营销型网站解决方案怎么查网站备案信息
  • 赤峰市做网站最好的ppt模板网站
  • 平台商城网站开发珠海网络推广
  • 网站布局设计规则手机网站运营
  • 免费申请logo烟台网站排名优化价格
  • 重庆永川网站建设价格wordpress 简码插件
  • 一台电脑如何做网站南通企业网站制作
  • 管理系统网站模板下载房地产估价师考试
  • 网站功能模版公司网站备案怎么弄
  • 陇城科技网站建设青岛做网站哪家优化好
  • 建设银行申请信用卡网站首页厦门茶叶公司 网站建设
  • asp.net微信网站免费自己开发app软件
  • wordpress怎么不调用文字内容天天seo百度点击器
  • 有哪些做画册的网站设计自己的专属logo
  • php网站开发软件自己写的html放入wordpress
  • 阿里巴巴国际站网页版湘潭网站
  • 大连网站制作怎么做南宁市保障住房建设管理服务中心网站
  • 山西网站的公司深圳设计品牌网站
  • 做网站app要多钱aso应用优化
  • 做网站的颜色国内h5网站欣赏
  • 免费行情软件app网站下载大全广告设计与制作专业培训
  • 网站ui设计学的是什么wordpress站内搜索插件
  • 代理招商平台seo网站优化方案书
  • wordpress全站采集wordpress 数据表设计
  • 泰安手机网站建设报价企业搜索平台
  • 营销型网站建设大概多少钱18款禁用网站app入口
  • 学校网站源码html免费按模板制作微网站
  • 平湖公司做网站高效省心的app定制开发平台
  • 北京建网站公司哪家便宜上海团购网站建设