0

0

Java中对象克隆的核心概念和使用方法

P粉602998670

P粉602998670

发布时间:2025-09-16 23:20:02

|

720人浏览过

|

来源于php中文网

原创

Java中对象克隆分为浅克隆和深克隆:浅克隆仅复制基本类型和引用地址,共享引用对象;深克隆递归复制所有引用对象,实现完全独立。默认clone()方法为浅克隆,需实现Cloneable接口并重写clone方法。深克隆可通过手动克隆引用字段、序列化或第三方库实现。注意克隆不调用构造函数,语义模糊,建议使用复制构造函数或静态工厂方法替代。

java中对象克隆的核心概念和使用方法

在Java中,对象克隆指的是创建一个已有对象的副本。与直接赋值不同,克隆能生成独立的新对象,避免修改副本时影响原对象。理解克隆机制对处理对象复制场景非常重要,比如缓存、备份或防止外部修改内部数据。

克隆的核心概念:浅克隆与深克隆

Java中的克隆分为浅克隆和深克隆两种方式:

  • 浅克隆(Shallow Clone):只复制对象本身的基本类型字段和引用地址,不复制引用对象。这意味着原对象和克隆对象会共享引用类型的成员变量。
  • 深克隆(Deep Clone):不仅复制对象本身,还会递归复制所有引用的对象,确保原对象和副本完全独立。

默认情况下,Object类的clone()方法实现的是浅克隆。如果需要深克隆,必须手动实现或借助其他手段。

如何使用克隆:实现Cloneable接口并重写clone方法

要让一个类支持克隆,必须遵循以下步骤:

立即学习Java免费学习笔记(深入)”;

  • 实现
    Cloneable
    接口(这是一个标记接口,无方法)。
  • 重写
    Object
    类中的
    clone()
    方法,并将其访问修饰符改为
    public
  • 在方法内部调用
    super.clone()
    ,并处理可能抛出的
    CloneNotSupportedException
    异常。

示例代码:

public class Person implements Cloneable {
    private String name;
    private int age;
    private Address address; // 引用类型

    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    @Override
    public Person clone() {
        try {
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError(); // 不应发生
        }
    }

    // getter和setter省略
}

此时调用

person.clone()
得到的是浅克隆对象。如果修改克隆对象的
address
,原始对象也会受影响。

ONLYOFFICE
ONLYOFFICE

用ONLYOFFICE管理你的网络私人办公室

下载

实现深克隆的常用方法

为了实现深克隆,可以采用以下几种方式:

  • 在clone方法中手动克隆引用对象:对每个引用类型字段也调用其clone方法。
  • 使用序列化机制:将对象序列化为字节流再反序列化,从而获得完全独立的副本,适用于复杂对象结构。
  • 使用第三方库:如Apache Commons Lang中的
    SerializationUtils.clone()
    ,简化深克隆操作。

改进上面的例子实现深克隆:

@Override
public Person clone() {
    try {
        Person cloned = (Person) super.clone();
        cloned.address = this.address.clone(); // 假设Address也实现了克隆
        return cloned;
    } catch (CloneNotSupportedException e) {
        throw new AssertionError();
    }
}

注意:引用的对象(如Address)也必须支持克隆,否则无法完成深克隆。

克隆的注意事项和替代方案

虽然克隆机制存在,但在实际开发中需谨慎使用:

  • 克隆的语义不够清晰,容易引发误解。
  • 构造函数不会被调用,可能导致初始化逻辑缺失。
  • 多层嵌套对象时,维护深克隆代码较繁琐。

因此,很多情况下推荐使用其他方式替代克隆,例如:

  • 提供复制构造函数:
    new Person(other)
  • 使用静态工厂方法:
    Person.copyOf(original)
  • 利用现代框架(如BeanUtils)进行属性复制

基本上就这些。掌握克隆的关键在于理解浅克隆的局限性和深克隆的实现方式,根据实际需求选择合适的方法。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1133

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

213

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1778

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

20

2026.01.19

apache是什么意思
apache是什么意思

Apache是Apache HTTP Server的简称,是一个开源的Web服务器软件。是目前全球使用最广泛的Web服务器软件之一,由Apache软件基金会开发和维护,Apache具有稳定、安全和高性能的特点,得益于其成熟的开发和广泛的应用实践,被广泛用于托管网站、搭建Web应用程序、构建Web服务和代理等场景。本专题为大家提供了Apache相关的各种文章、以及下载和课程,希望对各位有所帮助。

411

2023.08.23

apache启动失败
apache启动失败

Apache启动失败可能有多种原因。需要检查日志文件、检查配置文件等等。想了解更多apache启动的相关内容,可以阅读本专题下面的文章。

931

2024.01.16

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

18

2026.01.29

clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址
clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址

clawdbot龙虾机器人官网入口:https://clawd.bot/,clawdbot ai是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

12

2026.01.29

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

8

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 53万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号