当前位置:首页 > Java

java如何拷贝对象

2026-03-18 06:45:27Java

深拷贝与浅拷贝的概念

浅拷贝仅复制对象的引用,不复制内部属性指向的对象;深拷贝会递归复制所有属性指向的对象,生成完全独立的副本。

实现浅拷贝的方法

1. 使用clone()方法
类需实现Cloneable接口并重写clone()方法:

java如何拷贝对象

class Person implements Cloneable {
    String name;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
// 调用
Person p1 = new Person();
Person p2 = (Person) p1.clone();

2. 通过构造方法或工厂方法
手动复制字段值:

Person p2 = new Person();
p2.name = p1.name;

实现深拷贝的方法

1. 递归调用clone()
对引用类型属性单独调用clone()

java如何拷贝对象

class Address implements Cloneable {
    String city;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

class Person implements Cloneable {
    Address address;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person cloned = (Person) super.clone();
        cloned.address = (Address) this.address.clone();
        return cloned;
    }
}

2. 使用序列化
通过ObjectOutputStreamObjectInputStream实现:

import java.io.*;

class DeepCopyUtil {
    static <T> T deepCopy(T obj) throws IOException, ClassNotFoundException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(obj);

        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return (T) ois.readObject();
    }
}
// 要求所有涉及类实现Serializable接口

3. 第三方库工具
Apache Commons Lang的SerializationUtils

Person p2 = SerializationUtils.clone(p1);

注意事项

  • clone()方法可能导致浅拷贝问题,需谨慎处理嵌套对象。
  • 序列化方式性能较低,但适合复杂对象图的深拷贝。
  • 确保被拷贝对象的类及其引用类型属性均支持所用拷贝方式(如CloneableSerializable)。

标签: 对象java
分享给朋友:

相关文章

java如何react

java如何react

在Java中使用React 要在Java项目中集成React,通常需要将React前端与Java后端结合使用。以下是几种常见的方法: 使用Spring Boot作为后端 Spring Boot是一个…

java如何导包

java如何导包

导入包的方法 在Java中,导入包(package)可以通过import语句实现,用于引入其他类或包中的功能。以下是几种常见的导包方式: 导入单个类 import java.util.ArrayL…

如何导入java项目

如何导入java项目

导入Java项目的方法 使用IDE导入(如IntelliJ IDEA或Eclipse) 打开IDE后选择导入现有项目,导航至项目根目录(包含pom.xml或build.gradle的文件位置)。IDE…

java如何返回数组

java如何返回数组

返回数组的方法 在Java中,可以通过多种方式返回数组。以下是几种常见的方法: 直接返回数组 定义一个方法,返回类型为数组类型,直接在方法内部创建并返回数组。 public int[] getI…

java如何调用另一个类的方法

java如何调用另一个类的方法

调用另一个类的方法 在Java中调用另一个类的方法,通常需要创建该类的对象或直接通过类名调用(静态方法)。以下是几种常见的方式: 通过对象实例调用实例方法 创建一个目标类的对象,通过对象调用其方法。…

react如何创建对象参数

react如何创建对象参数

在React中创建对象参数通常涉及组件的props或state管理。以下是几种常见方法: 使用props传递对象参数 通过props直接将对象传递给子组件,适用于父子组件通信。 // 父组…