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;
}
//其他方法
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


