TestVO a = new TestVO();

a.setName("xiemingmei");

a.setBirthPlace("Hunan");

TestVO b = new TestVO();

b.setName(a.getName());

b.setBirthPlace(a.getBirthPlace());

(2) 通过复写object.clone来实现。

class TestVO implements Cloneable {

.......

TestVO clone(){

return (TestVO)super.clone();

}

}

TestVO a = new TestVO();

a.setName("xiemingmei");

a.setBirthPlace("Hunan");

TestVO b = a.clone();

(3)通过工具类,如spring的BeanUtils, 属性个数很多时候适用。

TestVO a = new TestVO();

a.setName("xiemingmei");

a.setBirthPlace("Hunan");

TestVO b = new TestVO();

BeanUtils.copyProperties(a, b);

另外,如果Java对象的属性都是只读类的话,如原始数据类型、数据封装类、String、BigDecimal、BigInteger等,那么浅层复制与深层复制达到的效果是一样的。如果属性有Date或其他自定的数据类,则一定的小心了,因为这时浅层复制后对象B的属性F1与原始对象A的对应属性F2,都是引用到同一个对象O,如果通过B.F1的方法改了O的值,则修改会影响到A.F1,这时也就会发生互串的情况。以下例子可以说明这个情况。

TestVo tv = new TestVo();

tv.setT1("t1");

tv.setT(new Date(1000000L));

System.out.println("Tv.T:" + tv.getT());

System.out.println("Tv.T1:" + tv.getT1());

System.out.println("-------------------------------");

TestVo tv2 = (TestVo)tv.clone();

System.out.println("tv.T1==tv2.T1:" + (tv.getT1() == tv2.getT1()));

System.out.println("tv.T==tv2.T:" + (tv.getT() == tv2.getT()))

(1)tv2.getT().setTime(2000000L);

System.out.println("Tv2.T:" + tv2.getT());

System.out.println("-------------------------------");

TestVo tv3 = new TestVo();

BeanUtils.copyProperties(tv, tv3);

System.out.println("tv.T1==tv3.T1:" + (tv.getT1() == tv2.getT1()));

System.out.println("tv.T==tv3.T:" + (tv.getT() == tv2.getT()));

(2)tv3.getT().setTime(30000000L);

System.out.println("Tv3.T:" + tv3.getT());输出结果为:

Tv.T:Thu Jan 01 08:16:40CST 1970

Tv.T1:t1

-------------------------------

tv.T1==tv2.T1:true

tv.T==tv2.T:true

Tv.T::Thu Jan 01 08:33:20 CST 1970

-------------------------------

tv.T1==tv3.T1:true

tv.T==tv3.T:true

Tv.T:::Thu Jan 01 16:20:00 CST 1970

大家可以看出,(1)(2)的代码操作的是tv2、tv3,但是tv的T的值发生了改变。因为T是Date类型的,而Date是一个可变的类,这样浅层复制就出现属性值互串的情况。

分享到:

2011-06-11 15:41

浏览 13474

评论

7 楼

呆呆DE萌萌

2014-03-12

第一种情况是浅度复制?是深度复制吧~

6 楼

大江帅

2013-08-28

ltyjyufo 写道

那深层复制怎么实现阿,楼主这说的只是浅层复制阿,既然浅层复制后对象B的属性F1与原始对象A的对应属性F2,都是引用到同一个对象O,如果通过B.F1的方法改了O的值,则修改会影响到A.F1,这时也就会发生互串的情况,楼主也没有提出解决的方法阿

可用用ObjectOutputStream和ObjectInputStream来实现深层复制

5 楼

xiemingmei

2012-11-07

ltyjyufo 写道

那深层复制怎么实现阿,楼主这说的只是浅层复制阿,既然浅层复制后对象B的属性F1与原始对象A的对应属性F2,都是引用到同一个对象O,如果通过B.F1的方法改了O的值,则修改会影响到A.F1,这时也就会发生互串的情况,楼主也没有提出解决的方法阿

要分只读类的对象和可写类的对象。对于只读的,没有关系,无需建新对象;对于可写的,则需要用类似以下的代码: ClassO1 b = new ClassO1();

BeanUtils.copyProperties(a, b);   再来复制一个对象出来。

4 楼

ltyjyufo

2012-11-03

那深层复制怎么实现阿,楼主这说的只是浅层复制阿,既然浅层复制后对象B的属性F1与原始对象A的对应属性F2,都是引用到同一个对象O,如果通过B.F1的方法改了O的值,则修改会影响到A.F1,这时也就会发生互串的情况,楼主也没有提出解决的方法阿

3 楼

yljf1314

2012-08-22

那既然我们一般使用的是浅复制,那如何解决这种问题,实现深复制呢?

2 楼

xiemingmei

2011-06-15

如果A.F1的内容改变,比如调用A.F1.setX(*),则B.F1.X也会发生变化。

如果A.F1=obj,这是不会对B.F1产生影响的,应为F1的引用变了,这时,A.F1与B.F1所指向的不是同一个对象。

浅层复制··如果要是A或者B改变了的话··那两外一个对象会不会改变?

java对象复制_Java对象的深层复制与浅层复制相关推荐

  1. JAVA浅层复制深层复制理解-java_01_20160824

    在java中,默认是浅层复制的,如果要复制的对象中只含有基本数据类型和String类型, 那么浅层复制和浅层复制是没有区别的,所以你可以放心的使用默认的浅层复制, 但是如果要复制的对象中除了上述类型还 ...

  2. [转载] 深层复制构造函数和浅层复制构造函数区别

    参考链接: Python复制(深层复制和浅层复制) 构造函数用来初始化对象的,复制构造函数是把一个已知的对象复制给新的对象,(2者都是对象). 浅复制构造函数只复制指针(换句话说就是2个对象的地址一样 ...

  3. 浅层学习与深层学习_深层副本与浅层副本-以及如何在Swift中使用它们

    浅层学习与深层学习 by Payal Gupta 通过Payal Gupta 深层副本与浅层副本-以及如何在Swift中使用它们 (Deep copy vs. shallow copy - and h ...

  4. 如何在JavaScript中区分深层副本和浅层副本

    by Lukas Gisder-Dubé 卢卡斯·吉斯杜比(LukasGisder-Dubé) 如何在JavaScript中区分深层副本和浅层副本 (How to differentiate betw ...

  5. java浅度克隆_java对象 深度克隆(不实现Cloneable接口)和浅度克隆

    为什么需要克隆: 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说 ...

  6. java初始化实例化_Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...

  7. java 对象复活_Java对象复活

    java 对象复活 总览 收集覆盖了finalize()的对象之后,将其添加到终结处理队列中,以在调用每个对象的finalize()方法之后进行清理. 如果您复活了物体,会发生什么? 何时定案? fi ...

  8. java jol原理_Java对象布局(JOL)实现过程解析

    java对象布局JOL(java object layout),描述对象在堆内存的布局.如下图: 1.markword 固定长度8byte,描述对象的identityhashcode,分代年龄,锁信息 ...

  9. java开源对象池_JAVA 对象池

    GenericObjectPool利用一个org.apache.commons.collections.CursorableLinkedList对象来保存对象池里的对象.这种对象池的特色是: 可以设定 ...

最新文章

  1. CUDA动态库封装以及调用
  2. 今天整理了短距离传输技术的比较!有用得到的,请拿走不谢!
  3. 9.1 ps:查看进程
  4. vim学习日志(5):vim下wimrc的配置,解决中文乱码问题
  5. 统一设置网站html文件输出编码为utf-8,以解决乱码问题
  6. Leetcode刷题(4)罗马数字转整数
  7. recyclerview item动画_这可能是你见过的迄今为止最简单的RecyclerView Item加载动画...
  8. 06 使用VS2012开发简单控制器程序 1214
  9. Zend Studio 10.6正式版注册破解地址
  10. java手动分页工具类
  11. Skype For Business Server 2015 离线消息
  12. 深入浅出MFC 读书笔记1
  13. 87相似标准形08——Jordan标准形
  14. 酷派无线升级服务器设置在哪里,酷派手机CDA自助升级线刷工具安装教程
  15. win10深度清理c盘垃圾的方法【系统天地】
  16. 软件测试工作的基本流程是什么
  17. 云计算技术,主要包含哪些关键技术?
  18. Context上下文到底是个什么东东?
  19. np.arry()的用法
  20. Ableton Live Suite 10.1.15 WiN 音乐制作宿主软件下载

热门文章

  1. 好朋友的爬虫共享资料,真佩服
  2. 在Python数据库连接池中如何创建请求连接的方案
  3. 大数据分析-时间序列(pandas库 )
  4. webbrowser控件 加载为空白_OpenLayers教程五:地图控件之坐标拾取控件和鹰眼控件...
  5. 2字节取值范围_C语言整数的取值范围以及数值溢出
  6. python批量创建实例_Django批量创建Model实例
  7. easyui datalist 不显示数据_爬虫练习——豆瓣电影信息爬取及数据可视化
  8. nvme装系统不能自引导_新买的固态硬盘用AHCI不能装系统,而用IDE却可以?问题就在这里...
  9. cas云计算机管理平台添加加密锁,CAS云计算管理平台安装手册.docx
  10. 2019 - OO第一单元作业总结