Java中如何进行对象复制呢?
下文笔者讲述Java中对象复制的方法及示例分享,如下所示
对象复制简介
对象复制: Java编程中的一个重要概念 它涉及到对对象属性值的复制和传递 对于一个Java类 开发者可通过定义构造器 实现一个全新的对象 或 使用clone()方法进行对象复制 或 使用序列化和反序列化的方式 将对象转换为字节流,再进行传递或复制 Java语言的对象复制类型: 浅拷贝和深拷贝 浅拷贝: 指创建一个新对象,并将原始对象的值复制到新对象 但是对于引用类型,实际上复制的只是引用地址,即复制后的对象和原始对象指向同一个引用 深拷贝: 对于引用类型,将引用也进行递归复制 即将原始对象中的所有对象都进行复制
对象复制的常见操作方法
方式一: 将一个对象的属性值复制到另一个对象中 方式二: 在对象之间共享数据时,需要生成一份原始对象的拷贝
二、对象复制的实现示例
1、构造函数实现对象复制
public class Person { private String name; private int age; public Person() {} public Person(Person other) { this.name = other.name; this.age = other.age; } //其他方法 }
2、Cloneable接口和clone()方法实现对象复制
Java中 使用Cloneable接口和clone()方法进行对象复制 Cloneable接口: 一个标记接口,用于标识该类的对象支持clone()方法 clone()方法: 在Object中定义的方法,子类需要实现该方法来支持对象的克隆 clone()方法的功能 创建并返回当前对象的一个副本 与原对象相等的属性也都相等例:Cloneable接口和clone()方法的示例
public class Person implements Cloneable { private String name; private int age; public Person() {} public Person clone() throws CloneNotSupportedException { return (Person)super.clone(); } //其他方法 }
3、序列化和反序列化实现对象复制
Java中 还可以通过序列化和反序列化来实现对象复制 序列化的过程: 将对象转换成字节流,后续通过反序列化将其还原回对象例:序列化和反序列化示例
public class Person implements Serializable { private String name; private int age; public Person() {} public Person clone() throws CloneNotSupportedException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); oos.flush(); oos.close(); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); Person copy = (Person)ois.readObject(); ois.close(); return copy; } //其他方法 }
三、浅拷贝和深拷贝
1、浅拷贝
浅拷贝: 指将一个对象的值复制到一个新的对象中 对于基本类型来说 这种操作可以直接复制 而对于引用类型来说 只复制其引用地址 而不会对其引用的对象进行复制例:浅拷贝
public class Person implements Cloneable { private String name; private int age; private list hobbies; public Person() {} public Person clone() throws CloneNotSupportedException { return (Person)super.clone(); } //其他方法 }
2、深拷贝
深拷贝: 指对于引用类型,递归地进行拷贝操作 即对于原始对象的所有属性,都进行复制操作例:深拷贝
public class Person implements Cloneable { private String name; private int age; private List hobbies; public Person() {} public Person clone() throws CloneNotSupportedException { Person person = (Person)super.clone(); List copyHobbies = new ArrayList<>(); for(String hobby: this.hobbies) { copyHobbies.add(hobby); } person.hobbies = copyHobbies; return person; } //其他方法 }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。