当前位置: 首页 > news >正文

Cloneable接口与clone方法---java

浅拷贝

我们知道,在浅拷贝的时候当前类必须实现 Cloneable 接口并重写 clone() 方法,,那么为什么必须实现 Cloneable 接口并重写 clone() 方法呢?

我们首先看一下Cloneable接口,可以看到 Cloneable 接口没有任何方法

package java.lang;
/**
 * @author  unascribed
 * @see     java.lang.CloneNotSupportedException
 * @see     java.lang.Object#clone()
 * @since   JDK1.0
 */
public interface Cloneable {
}

我们再看看位于Object类中的clone()这个函数方法。

protected native Object clone() throws CloneNotSupportedException;

首先是对这个方法的介绍,它是一个native标记的方法,它返回的是对该对象Object的拷贝。可能会出现CloneNotSupportedException异常。

为什么实现 Cloneable 接口

Cloneable 接口没有任何方法,它的唯一作用是 告知 JVM:某个类允许被克隆。
当你调用 obj.clone() 时,JVM 底层会检查 obj 的类是否实现了 Cloneable 接口

历史来源

Java 1.0 的设计者希望通过标记接口(而非注解,当时注解还未出现)让开发者显式声明类的克隆能力。
如果没有 Cloneable 接口,所有对象默认都可以被克隆,这可能带来安全隐患(例如克隆本应不可变的对象)。

为什么重写 clone 方法

这与 protected 修饰导致的权限问题有关
假设有一个类 MyClass(未重写 clone(),但实现了 Cloneable):

package com.example;

public class MyClass implements Cloneable {
    // 未重写 clone()
}

尝试在另一个包中调用 clone():

package another.package;

public class Test {
    public static void main(String[] args) {
        MyClass obj = new MyClass();
        obj.clone(); // 编译错误:clone() has protected access in Object
    }
}

关键限制:即使 MyClass 是 Object 的子类,跨包时无法直接通过子类实例访问父类的 protected 方法(除非子类重写并暴露该方法),跨包时连子类实例都无法访问自己的 protected 方法

http://www.dtcms.com/a/44442.html

相关文章:

  • 基于51单片机的压力测量报警proteus仿真
  • python数据类型等基础语法
  • Spring源码分析のregisterrefresh全过程(上)
  • C/C++动静态库的制作与原理 -- 静态库,动态库,目标文件,ELF文件,动态链接,静态链接
  • ChatGPT与DeepSeek:开源与闭源的AI模型之争
  • DeepSeek 助力 Vue3 开发:打造丝滑的网格布局(Grid Layout)
  • Selenium自动化测试:如何搭建自动化测试环境,搭建环境过程应该注意的问题
  • 基于Selenium的Python淘宝评论爬取教程
  • 基于yolov8的农作物叶子病害检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • Java数据结构第十五期:走进二叉树的奇妙世界(四)
  • 基于SSM实现的bbs论坛系统功能实现八
  • 第 11 章:当代定价问题总结
  • 使用ChatGPT-Deep Reaserch两步给出文献综述!
  • Linux服务升级:Almalinux 升级 DeepSeek-R1
  • 《信息论与编码》课程笔记——绪论和离散信源(一)
  • 【异地访问本地DeepSeek】Flask+内网穿透,轻松实现本地DeepSeek的远程访问
  • Autotestplat 在多个平台和公司推荐使用!
  • MyBatis-Plus 为简化开发而生【核心功能】
  • 最新Flutter导航拦截PopScope使用
  • 王道第三章栈和队列
  • PyTorch 系统教程:理解机器学习数据分割
  • 学习笔记08——ConcurrentHashMap实现原理及源码解析
  • 网络空间安全(6)web应用程序技术
  • CSS—隐藏元素:1分钟掌握与使用隐藏元素的方法
  • 【Linux第一弹】Linux基础指令(上)
  • 基于PHP和MySQL的用户登录注册系统实现
  • 测试向丨多模态大模型能做宠物身份识别吗?
  • LabVIEW中交叉关联算法
  • MongoDB安全管理
  • Linux笔记---缓冲区