最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何使用clone方法实现对象的浅克隆及标记接口的防护作用
时间:2026-06-20 10:08:25 编辑:袖梨 来源:一聚教程网
Java中实现浅克隆必须做对三件事:类显式实现Cloneable接口、重写public clone()方法、方法体内调用super.clone();Cloneable是无方法的标记接口,仅作为JVM许可检查依据,未实现则抛CloneNotSupportedException,super.clone()执行字段级复制,基本类型和不可变引用独立,可变引用共享同一实例。
用 clone() 实现浅克隆,关键不在“写得多”,而在“做对三件事”:声明接口、改访问权限、调用父类实现。而 Cloneable 接口本身不干任何事——它只是 JVM 门前的一张通行证,没它,连门都进不去。
浅克隆的三步落地写法
缺一不可,顺序无关,但每一步都有明确目的:
-
显式 implements Cloneable:哪怕接口空着,也得写上。这是 JVM 运行时检查的唯一依据;不写,
super.clone()一执行就抛CloneNotSupportedException -
重写 clone() 并设为 public:原生是
protected,外部类根本调不到;改成public才能被正常使用 - 方法体内 return super.clone():这是触发 JVM 底层字段级拷贝的唯一入口;它不走构造器,也不反射,快但只到表面
Cloneable 的真实角色:一道物理闸门
它不是工具,是守门人。它的存在不是为了帮你复制,而是防止你误操作:
- 没有实现
Cloneable→clone()调用直接失败,不会静默共享或出错数据 - 实现了
Cloneable→ JVM 放行,执行内存级逐字段复制,但不保证逻辑安全(比如 final 字段、可变引用仍可能出问题) - 它不定义方法、不参与拷贝逻辑、不修改字段行为,纯粹是运行时的许可标记
浅克隆到底复制了什么
理解这点,才能预判副作用:
- 基本类型(int、boolean…)和不可变引用(String、Integer)→ 完全独立:改副本不影响原对象
- 可变引用类型(自定义对象、ArrayList、数组等)→ 只复制地址:新旧对象共用同一实例,改其中一处,另一处跟着变
- 典型例子:
Person克隆后改address.city,原Person的地址也变——因为它们的address指向堆里同一个对象
常见踩坑点与应对提示
这些错误看似小,却常导致运行时报错或行为诡异:
- 只加
implements Cloneable,却不重写clone()→ 编译通过,但外部调用报错(protected方法不可见) - 重写了
clone()却忘了改public→ 子类或工具类无法调用 - 字段含
final List<String>等不可变引用 →super.clone()无法重赋值,需在方法里手动新建并 set - 继承链中父类没处理好 → 子类调
super.clone()可能返回错误类型,甚至抛异常
相关文章
- 刀剑缭乱2026公测兑换码大全一览 07-05
- 崩坏星穹铁道4.0卡池7个新角色一览 07-05
- 明日方舟终末地开服工业蓝图一览 工业蓝图作用与使用思路解析 07-05
- 原神梦之树怎么开启 梦之树开启条件 07-05
- 帕瓦勇者传说持续伤害阵容搭配推荐 07-05
- 明日方舟:终末地全新玩法 蚀像寻遗怎么玩介绍 07-05