首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
怎么利用 Object.clone() 实现对象的浅拷贝并理解其 Cloneable 接口的要求

怎么利用 Object.clone() 实现对象的浅拷贝并理解其 Cloneable 接口的要求

热心网友
81
转载
2026-05-01

怎么利用 Object.clone() 实现对象的浅拷贝并理解其 Cloneable 接口的要求

怎么利用 Object.clone() 实现对象的浅拷贝并理解其 Cloneable 接口的要求

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

Object.clone() 为什么不能直接调用

很多开发者第一次尝试调用 clone() 时都会碰壁,原因其实有两点。首先,这个方法在 Object 类中被声明为 protected,这意味着外部代码无法直接访问,除非当前类自己把它“放出来”。但更关键、也更容易被忽略的一点在于,Object 的默认实现内置了一个运行时检查:它会严格审视调用者是否实现了 Cloneable 这个标记接口。如果没有,它可不会客气地返回个 null,而是直接抛出 CloneNotSupportedException

所以,你常常会看到这样的场景:代码 myObj.clone() 在编译期一帆风顺,一到运行时就报出异常。问题的根源,十有八九是忘了声明那个看似空无一物的接口,或者漏掉了重写方法那一步。

  • 第一步,必须让类实现 Cloneable 接口。别小看这个空接口,它是 JVM 识别克隆资格的“通行证”。
  • 第二步,必须重写 clone() 方法,并将其访问权限提升为 public
  • 第三步,在重写时,建议调用 super.clone() 来启动拷贝流程,而不是手动进行 new 对象和字段赋值,否则就失去了浅拷贝的原本语义。

浅拷贝的实际效果和典型陷阱

那么,默认的 Object.clone() 究竟做了什么呢?它执行的是标准的浅拷贝:只复制对象自身的各个字段。对于基本类型字段,值被完整复制;但对于引用类型字段,复制的仅仅是那个引用地址,而不是引用所指向的堆内存中的那个实际对象。这就导致了一个核心结果:原始对象和它的克隆体,会共享内部的可变对象。

这种特性决定了它的适用场景:当你的类字段全是基本类型,或者包含的是像 StringInteger 这样的不可变对象时,浅拷贝完全够用。当然,如果你本身就希望克隆对象共享某些内部状态,那它更是绝佳选择。

不过,陷阱也往往藏在这里:

  • 如果类里有个 ArrayList 字段,克隆之后,两个对象的 list 字段指向的是内存中的同一个列表实例。此时,修改任何一个对象列表里的内容,另一个对象会立刻“感知”到变化。
  • 如果字段是自定义的可变类,比如 Person 里有个 Address address,而 Address 类自己没有实现深拷贝逻辑,那么这个 address 对象同样会被共享。
  • 另外,Cloneable 接口本身并不强制要求你重写 clone() 方法,但如果你不重写,这个类就等于没有对外提供真正的克隆能力。

正确实现 Cloneable 的最小可行代码

理论说再多,不如看一段最简实现。下面是一个完整且正确的示例,请特别注意访问修饰符、异常声明和调用链:

public class User implements Cloneable {
    private String name;
    private int age;
    private ArrayList tags;

    @Override
    public User clone() {
        try {
            return (User) super.clone(); // 浅拷贝本体
        } catch (CloneNotSupportedException e) {
            throw new AssertionError("Cloneable interface is implemented, this should never happen", e);
        }
    }
}

这段代码说明了几个要点:

  • super.clone() 已经完成了所有字段的逐位复制,包括 tags 这个引用本身。注意,复制的是引用,而不是 tags 列表里的元素。
  • 如果需要实现深拷贝,例如希望 tags 列表也被完整复制一份,就必须在 clone() 方法里手动处理,比如用 new ArrayList<>(this.tags) 来创建一个新的列表实例。
  • 切记,不要在 clone() 方法内部去调用类的构造函数,那样就完全背离了克隆的语义。

Cloneable 接口没有方法却必不可少的原因

你可能会好奇,一个没有任何方法的接口,凭什么如此重要?答案是,Cloneable 是 JVM 层面的一个“契约标记”。Object.clone() 在底层实现中,会通过 getClass().isInterface() 等机制检查类的标记位,这个检查发生在运行时,而非编译期。因此,即使你在类里完整地写了一个 public Object clone() 方法,但只要省略了 implements Cloneable 这句声明,运行时依然会抛出异常。

再来看看它的性能与兼容性影响:

  • 浅拷贝的性能开销极小,远胜于通过序列化或反射机制实现的拷贝,在性能敏感的场景下优势明显。
  • 但是,需要注意一个重要的风向变化:在 JDK 17 及以后的版本中,Cloneable 已被标记为 @Deprecated(forRemoval = true)。这传递出一个清晰的信号:官方更倾向于使用构造器、记录类(record),或者 copyOf() 风格的 API 来作为替代方案。
  • 尽管如此,许多第三方库(例如 Apache Commons Lang 中的 BeanUtils.cloneBean())在底层可能仍然依赖这套机制,因此在兼容性考量上仍需留意。

最后,还有一个容易被忽略的细节:即便一个类的所有字段都是不可变的,只要它声明了 Cloneable 并重写了 clone(),就必须考虑继承链的安全。如果继承链中某个父类没有正确重写 clone(),那么子类在调用 super.clone() 时,仍然可能遭遇失败。这才是设计一个可克隆类时需要通盘考虑的关键所在。

来源:https://www.php.cn/faq/2399782.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

三角洲行动长弓溪谷密码汇总2026有哪些
游戏攻略
三角洲行动长弓溪谷密码汇总2026有哪些

在《三角洲行动》中,长弓溪谷地图的“2026”系列密码是解锁隐藏区域与高级资源的关键。掌握这些密码不仅能开启封锁区域获取强力装备,还能触发专属剧情任务,大幅提升你的游戏体验与探索自由度。 三角洲行动长弓溪谷密码汇总与2026密码获取全攻略 具体而言,长弓溪谷中的“2026密码”通常巧妙地隐藏在地图环

热心网友
05.01
DNF助手雪球活动有哪些注意事项
游戏攻略
DNF助手雪球活动有哪些注意事项

掌握DNF助手雪球活动核心玩法,轻松领取海量游戏奖励 在《地下城与勇士》的冒险旅程中,DNF助手雪球活动为玩家提供了一个绝佳的福利获取渠道。参与这项活动不仅能丰富游戏体验,更能为角色成长积累大量实用资源,有效提升刷图与攻坚副本的效率。 DNF助手雪球活动完整参与指南与核心注意事项 要高效参与活动,首

热心网友
05.01
京剧四大名旦之一是哪位表演艺术家
游戏攻略
京剧四大名旦之一是哪位表演艺术家

京剧作为中国的国粹,孕育了无数杰出的表演艺术大师。其中,梅兰芳、程砚秋、尚小云、荀慧生并称为“京剧四大名旦”,他们的艺术成就举世瞩目。那么,在知识问答或相关测试中,我们如何才能准确识别出哪位是四大名旦之一呢? 如何准确判断哪位表演艺术家属于京剧四大名旦 这既是一个经典的文化常识问题,也是一种有趣的互

热心网友
05.01
杀戮尖塔2全职业怎么玩
游戏攻略
杀戮尖塔2全职业怎么玩

在《杀戮尖塔2》的广阔天地中,四个初始职业各具特色,掌握其核心机制是通关爬塔之旅的关键。本文将为你深入解析战士、盗贼、魔法师与猎人的玩法精髓,助你快速上手,制定制胜策略。 《杀戮尖塔2》全职业深度解析与进阶指南 职业选择是《杀戮尖塔2》策略构筑的第一环,不同角色决定了完全不同的卡牌体系与作战风格。理

热心网友
05.01
饿狼传说群狼之城普莉查怎么进行基础连段
游戏攻略
饿狼传说群狼之城普莉查怎么进行基础连段

饿狼传说群狼之城普莉查基础连招教学与实战心得 想要精通《饿狼传说:群狼之城》中的普莉查(Pulica)吗?掌握她的基础连招是提升战斗力的核心一步。本教程将为你解析她的核心起手、连段节奏及实战应用,助你在开局阶段就能建立有效的压制,从而在对战中占据先机。 连招节奏把握与核心操作技巧 普莉查的连招拥有独

热心网友
05.01

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

我的世界正版账号在哪买
游戏攻略
我的世界正版账号在哪买

我的世界正版账号在哪买?权威平台推荐与安全购买全攻略 想要畅玩《我的世界》的所有游戏内容并享受完整社区支持,一个正版账号是必不可少的入场券。如何挑选靠谱渠道并确保交易安全,是许多玩家关心的首要问题。本文将为您系统梳理主流购买平台,并提供一套可操作的安全指南,助您无忧开启创造之旅。 官方渠道:最安全可

热心网友
05.01
三角洲行动长弓溪谷密码汇总2026有哪些
游戏攻略
三角洲行动长弓溪谷密码汇总2026有哪些

在《三角洲行动》中,长弓溪谷地图的“2026”系列密码是解锁隐藏区域与高级资源的关键。掌握这些密码不仅能开启封锁区域获取强力装备,还能触发专属剧情任务,大幅提升你的游戏体验与探索自由度。 三角洲行动长弓溪谷密码汇总与2026密码获取全攻略 具体而言,长弓溪谷中的“2026密码”通常巧妙地隐藏在地图环

热心网友
05.01
DNF助手雪球活动有哪些注意事项
游戏攻略
DNF助手雪球活动有哪些注意事项

掌握DNF助手雪球活动核心玩法,轻松领取海量游戏奖励 在《地下城与勇士》的冒险旅程中,DNF助手雪球活动为玩家提供了一个绝佳的福利获取渠道。参与这项活动不仅能丰富游戏体验,更能为角色成长积累大量实用资源,有效提升刷图与攻坚副本的效率。 DNF助手雪球活动完整参与指南与核心注意事项 要高效参与活动,首

热心网友
05.01
京剧四大名旦之一是哪位表演艺术家
游戏攻略
京剧四大名旦之一是哪位表演艺术家

京剧作为中国的国粹,孕育了无数杰出的表演艺术大师。其中,梅兰芳、程砚秋、尚小云、荀慧生并称为“京剧四大名旦”,他们的艺术成就举世瞩目。那么,在知识问答或相关测试中,我们如何才能准确识别出哪位是四大名旦之一呢? 如何准确判断哪位表演艺术家属于京剧四大名旦 这既是一个经典的文化常识问题,也是一种有趣的互

热心网友
05.01
王者荣耀空空儿怎么出装
游戏攻略
王者荣耀空空儿怎么出装

王者荣耀空空儿出装与实战教学:掌握高爆发刺客的致胜秘诀 在《王者荣耀》这款游戏中,胜负的天平往往倾斜于对细节的把控。想要精通刺客位,仅有极快的手速是远远不够的,合理的装备搭配和精准的入场时机,才是区分顶级刺客与团队短板的核心要素。本期攻略,我们将深入解析高机动性刺客英雄空空儿,为你详细拆解如何在游戏

热心网友
05.01