Java对象的浅层复制
来源:互联网 发布:医疗器械注册软件研究 编辑:程序博客网 时间:2024/05/20 19:32
JavaSpring
Java对象的浅层复制是指Java对象A本身被clone成新对象B,但A的属性没有被clone处理,只是把A的各个属性所指的对象赋值到B对应的属性上,A与B的相同属性都引用到同一个对象。
我们一般使用到对象复制是对象浅层复制,也就是没有复制属性成新的属性。
一般有三种方法对象的浅度复制:
(1)通过调用对象set方法来实现,属性个数比较少时适用。
- 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:40 CST 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是一个可变的类,这样浅层复制就出现属性值互串的情况。
0 0
- Java对象的浅层复制
- Java对象的浅层复制与深层复制
- java对象的复制,浅复制、深复制
- java-浅层复制和深层复制
- java对象的复制
- java对象的复制
- JAVA的对象复制
- java对象的复制
- java对象的复制
- java对象的复制
- Java对象的深复制和浅复制
- Java对象的深复制和浅复制
- Java对象的深复制和浅复制
- Java对象的深复制和浅复制
- Java对象的深复制和浅复制
- Java对象的深复制与浅复制
- 细说java对象的浅复制和深复制
- Java对象的深复制和浅复制
- [WCF权限控制]从两个重要的概念谈起:Identity与Principal
- 2014年年终总结:写书成长,承载收获
- PAT A1005 Spell It Right
- 模电书籍推荐
- 【总结】 - OC内存管理(1)
- Java对象的浅层复制
- hadoop实战基础篇(一)
- Android中Parcelable的使用
- 新专题探索 构建最小linux运行系统
- Java设计模式-6-模板方法模式
- Python黑客学习笔记:从HelloWorld到编写PoC(上)
- WeakHashMap的一点理解
- 关于java连接mysql数据库
- android 简单方法连接服务器-------云服务Bmob