当前位置:首页 > Java

java如何拷贝对象

2026-03-18 06:45:27Java

深拷贝与浅拷贝的概念

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

实现浅拷贝的方法

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

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()

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

java如何拷贝对象

Person p2 = SerializationUtils.clone(p1);

注意事项

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

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

相关文章

如何运行java程序

如何运行java程序

编写Java代码 创建一个以.java为扩展名的文件,例如HelloWorld.java。文件内容需包含一个类定义,类名必须与文件名一致。例如: public class HelloWorld {…

如何编写java程序

如何编写java程序

安装开发环境 下载并安装JDK(Java Development Kit),推荐从Oracle官网或OpenJDK获取最新版本。安装完成后配置环境变量,确保JAVA_HOME和PATH正确设置。 选…

如何安装java软件

如何安装java软件

下载Java安装包 访问Oracle官方网站或OpenJDK开源项目页面,选择适合操作系统的Java版本(如Windows、macOS或Linux)。对于个人使用,通常下载JDK(Java Devel…

php 实现 java md5加密

php 实现 java md5加密

PHP 实现 Java MD5 加密 Java 和 PHP 的 MD5 加密结果可能存在差异,主要由于字符编码和输出格式的不同。以下是确保 PHP 与 Java MD5 加密结果一致的方法。 确保字…

如何学java基础

如何学java基础

学习Java基础的方法 理解Java的基本概念 Java是一种面向对象的编程语言,掌握基础概念如类、对象、继承、多态和封装是必要的。熟悉Java的语法结构,包括变量、数据类型、运算符和控制语句。 安…

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

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

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