java对象复制_Java对象的深层复制与浅层复制

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是一个可变的类,这样浅层复制就出现属性值互串的情况。

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

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改变了的话··那两外一个对象会不会改变?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值