Java中将a对象转换为b对象及深复制的几种方式

(1)逐个属性赋值。(2)重写java.lang.Object类中的方法clone()。(3)使用org.apache.commons中的工具类BeanUtils和PropertyUtils进行对象复制。(4)通过JSON之间的转换,进行对象克隆。(5)通过序列化实现对象的复制。接下来,我们将详细介绍其中的几种方法。将A对象的值分别通过set方法加入B对象中对...
Java中将a对象转换为b对象及深复制的几种方式
在编程实践过程中,我们有时会遇到这样的需求:在某个时刻有一个对象A,其中已包含有效值,此时需要创建一个与A完全相同的新对象B,确保B的任何改动都不会影响到A中的值。这意 义是A与B是两个独立的对象,B的初始值由A对象确定。例如程序演示的情况:
结果:
>学生1:54321
>学生2:54321
为什么改变学生2的学号,学生1的学号也发生了变化呢?
原因在于(stu2 = stu1)。该操作将stu1的引用赋值给stu2,导致stu1和stu2指向内存堆中的同一对象。那么如何实现干净、清晰地复制一个对象呢?在Java中,仅使用简单的赋值语句无法满足这种需求,实现复制对象有多种方法:
(1)逐个属性赋值。
(2)重写java.lang.Object类中的方法clone()。
(3)使用org.apache.commons中的工具类BeanUtils和PropertyUtils进行对象复制。
(4)通过JSON之间的转换,进行对象克隆。
(5)通过序列化实现对象的复制。
接下来,我们将详细介绍其中的几种方法。
将A对象的值分别通过set方法加入B对象中对属性逐个赋值,适用于属性较少的场景,操作较为直观。但对于属性较多的对象,这种方式会导致大量的get、set方法调用,操作变得繁琐。
重写java.lang.Object类中的方法clone()介绍浅克隆和深克隆的概念。
浅克隆主要关注值类型的成员变量复制,而引用类型成员变量的引用地址保持不变。深克隆则会复制对象的引用类型成员变量,包括内部包含的对象。
浅克隆实现步骤:被复制的类需要实现Cloneable接口,并覆盖clone()方法,使用super.clone()实现基本复制。
结果展示:复制对象后,如果成员变量为引用类型,新对象与原对象引用同一内存地址。
深克隆完整代码实现深克隆,解决浅克隆的局限性。
结果展示:无论成员变量是值类型还是引用类型,复制对象时均会复制所有的成员变量。
使用工具类BeanUtils和PropertyUtils进行对象复制利用BeanUtils的copyProperties()方法将转换前的A类赋值给转换后的B类,简化属性复制过程。
注意点:属性名称需一致,B类存在A类不一定存在的属性,Spring的BeanUtils方法要求属性有getter和setter方法,且存在属性完全相同的内部类时,需特别注意。
通过JSON转换实现深克隆利用fastjson进行对象与JSON串之间的转换,本质为反射操作。
通过序列化实现对象的复制使用Java序列化机制,如SerializationUtils的clone()方法,要求对象实现Serializable接口。
总结与个人意见在性能要求不高时,可选择简单、易于实现的方法如fastjson、序列化或DozerBeanMapper等。在性能要求较高的场景下,推荐自定义工具类实现更灵活的复制逻辑。
2024-10-10
mengvlog 阅读 35 次 更新于 2025-09-09 19:05:51 我来答关注问题0
  •  翡希信息咨询 Java中将a对象转换为b对象及深复制的几种方式

    在Java中,将a对象转换为b对象并实现深复制的几种方式如下:逐个属性赋值:适用场景:适用于属性较少的场景。操作方式:通过b对象的setter方法,将a对象的属性值逐个赋值给b对象。注意事项:对于属性较多的对象,这种方式操作繁琐,容易出错。重写clone方法:浅克隆:被复制的类实现Cloneable接口,并覆盖clone...

  •  Cry_小衰 Java如何判断能否将A类型强制转换类型成B类型,就是将B b=(B) a;

    if (a instanceof B) ture可以 反之不可以 java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

  •  翡希信息咨询 java中各数据类型是如何实现强制类型转换的?

    如果a的值超出了int的范围,则b的值将是不确定的。对于对象类型,如果需要将父类引用强制转换为子类类型,这也需要强制进行。但是,这种转换只有在父类引用实际指向的是子类对象时才有效,否则会抛出ClassCastException异常。例如:Object obj = new A; B b = obj; 这里会报错,因为obj实际指向的是...

  •  翡希信息咨询 classcastexception是什么异常

    ClassCastException是Java编程中一种常见的运行时异常。以下是关于ClassCastException的详细解释:定义:ClassCastException通常发生在试图将一个对象强制转换为它实际并非的类型时。发生场景:这种错误往往出现在两个没有直接关系的类之间。例如,如果类A和类B之间没有任何继承或关联关系,当你尝试将类A的对象...

  •  dfttezn 在java,各种类型之间的强制转换会影响系统的性能吗?如:一个Object对象强制转换成User的一个实体类。

    对象的话 强制转换的对象之间的关系必须是父类子类的关系 就像你的例子 User一定是Object的子类所以可以转换 如果比如有二个不相干的类A和B 如果你强制吧A的对象转换成B的对象的话那除了Object里的方法外所有A的方法全部都不能用 也就是说没有任何意义 ...

檬味博客在线解答立即免费咨询

Java相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部