当前位置:首页 > Java

java 如何拷贝对象

2026-03-25 09:43:40Java

深拷贝与浅拷贝的区别

浅拷贝仅复制对象的引用而非对象本身,拷贝后的对象与原对象共享部分数据。深拷贝会创建一个全新的对象,包括所有嵌套对象,与原对象完全独立。

实现浅拷贝的方法

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

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

通过拷贝构造函数实现:

class MyClass {
    private int value;
    public MyClass(MyClass other) {
        this.value = other.value;
    }
}

实现深拷贝的方法

手动实现深拷贝需要递归复制所有嵌套对象:

class DeepCopyClass implements Cloneable {
    private NestedObject nested;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        DeepCopyClass copy = (DeepCopyClass) super.clone();
        copy.nested = (NestedObject) nested.clone();
        return copy;
    }
}

使用序列化实现深拷贝:

import java.io.*;

public class SerializationUtils {
    public static <T extends Serializable> T deepCopy(T object) {
        try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
             ObjectOutputStream oos = new ObjectOutputStream(bos)) {
            oos.writeObject(object);
            oos.flush();

            try (ObjectInputStream ois = new ObjectInputStream(
                 new ByteArrayInputStream(bos.toByteArray()))) {
                return (T) ois.readObject();
            }
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

第三方库解决方案

Apache Commons Lang提供的工具类:

java 如何拷贝对象

MyClass copy = SerializationUtils.clone(original);

注意事项

实现Cloneable接口时应注意浅拷贝可能带来的副作用。使用序列化方式要求所有涉及的对象都必须实现Serializable接口。对于复杂对象图,建议使用专门的深拷贝工具或手动实现完全复制逻辑。

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

相关文章

java如何输出

java如何输出

输出到控制台 使用 System.out.println() 方法输出内容到控制台,适用于调试或简单信息展示。 示例代码: System.out.println("Hello, World!")…

java如何自学

java如何自学

确定学习目标和路径 自学Java需要明确目标,例如开发Web应用、Android应用或后端服务。根据目标选择学习重点,如Java基础、Spring框架或Android开发。制定阶段性计划,从基础语法到…

java如何创建项目

java如何创建项目

使用IDE创建Java项目(以IntelliJ IDEA为例) 打开IntelliJ IDEA,选择“New Project”。 在左侧菜单中选择“Java”,确保已配置JDK(若无需手动添加)。 勾…

java如何实现多继承

java如何实现多继承

在Java中,由于语言设计本身不支持多继承(即一个类不能直接继承多个父类),但可以通过以下方式间接实现类似多继承的效果: 使用接口实现多继承 接口允许一个类实现多个接口,从而继承多个抽象行为。接口中…

如何学习java语言

如何学习java语言

学习Java语言的系统方法 理解基础概念 Java是一种面向对象的编程语言,掌握基础概念如变量、数据类型、运算符、控制流语句(if-else、循环)是第一步。熟悉类和对象的概念,理解封装、继承和多态三…

java如何返回数组

java如何返回数组

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