【Java】Clonable 接口

news2024/11/28 12:53:34

如何克隆一个引用所指的对象呢?首先一个前提,他是可克隆的,我们要实现一个Clonable 接口。我们来看一个这个接口:

可以发现里面是空的,我们把这种空接口叫做标记接口,作用就是表示当前对象是可以被克隆的。 

我们要实现克隆,首先要在类中重写Object的clone方法:

 

package csdn;

import java.lang.reflect.Array;
import java.util.Arrays;

class  student implements  Cloneable{
    public  String name;
    public student(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "student{" +
                "name='" + name + '\'' +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {  //重写父类Object的clone方法
        return super.clone();
    }
}
public class test2 {
    public static void main(String[] args) throws CloneNotSupportedException{
        student student1=new student("张三");
        student student2= (student)student1.clone();  //实现克隆,然后向下转型
        System.out.println(student1);
        System.out.println(student2);


    }
}

 

 这样就实现了简单的克隆。

那我们再考虑另一种情况,我们来看这一段代码:

package csdn;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.lang.reflect.Array;
import java.util.Arrays;
 class Money{
     double money=12.25;

 }
class  student implements  Cloneable{
    public  String name;
    public  Money  m=new Money();

    public student(String name) {
        this.name = name;
    }


    @Override
    protected Object clone() throws CloneNotSupportedException {  //重写父类Object的clone方法
        return super.clone();
    }
}
public class test2 {
    public static void main(String[] args) throws CloneNotSupportedException{
        student student1=new student("张三");
        student student2= (student)student1.clone();  //实现克隆,然后向下转型
        System.out.println(student1.m.money);
        System.out.println(student2.m.money);
        student2.m.money=99;
        System.out.println("==============");
        System.out.println(student1.m.money);
        System.out.println(student2.m.money);

    }
}

 理论上来说,给克隆的对象改了值应该不会影响原对象的money值,我们这都是克隆出去的,但是当我们运行的时候却发现原来对象的money值也被修改了(这种拷贝方式叫做浅拷贝):

 这跟我们的需求就不一样,这是什么原因呢?这是因为我们在克隆的时候没有克隆Money对象。

(糟糕的画图技术,希望大家能看明白) 

我们解决方法是把Money也克隆出来就可以了,Money也必须支持克隆,也就是实现Clonable 接口。

然后我们再来修改一下student类里面的克隆方法:

此时我们再来看一下运行结果,就跟之前不一样了:

 

 此时就达到了我们的深拷贝。所以如果要实现深拷贝,你当前对象里面的每一个对象都得克隆。

代码:

package csdn;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.lang.reflect.Array;
import java.util.Arrays;
 class Money implements Cloneable{
     double money=12.25;

     @Override
     protected Object clone() throws CloneNotSupportedException {  //重写父类Object的clone方法
         return super.clone();
     }
 }
class  student implements  Cloneable{
    public  String name;
    public  Money  m=new Money();

    public student(String name) {

        this.name = name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {  //重写父类Object的clone方法
        student student=(student)super.clone(); //只是克隆了student对象
        student.m=(Money)this.m.clone();  //克隆了student对象里面的Money对象
        return student;
    }
}
public class test2 {
    public static void main(String[] args) throws CloneNotSupportedException{
        student student1=new student("张三");
        student student2= (student)student1.clone();  //实现克隆,然后向下转型
        System.out.println(student1.m.money);
        System.out.println(student2.m.money);
        student2.m.money=99;
        System.out.println("==============");
        System.out.println(student1.m.money);
        System.out.println(student2.m.money);

    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试 | 双法妙解压缩字符串【遍历统计 + 双指针】

一、题目描述 原题传送门 二、思路分析 首先我们来分析一下解决本题所需要的思路 题目的意思很简单,就是统计原本的字符串中的每个字符出现的次数,然后以【字符,出现的次数】这样的结构来字符串,以起到一个压缩的效果&#xff0c…

Fiddler抓包实战,彻底打通接口测试(二)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 请求查看 Inspec…

Spring简述IOC入门案例

文章目录 Spring学习笔记Spring:Spriing framework:IoC(控制反转)对象的创建控制权由程序转移到外部:DI( Dependency Injection )依赖注入: IoC入门案例:项目结构:applicationContext.xml:bookD…

mysql-5.7 Linux安装教程

通过命令下载: 下载到 cd /usr/local 这个路径下 wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz 解压: tar -zxvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz 将解压的 重命名 为mysql mv mysql-5…

B/S架构的云HIS系统源码 技术架构:Angular+Nginx+ Java+Spring

基于云计算技术的B/S架构的HIS系统源码,为基层医疗机构提供标准化的、信息化的、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。系统利用云计算平台的技术优势,建立统一的健康档案存储平台&#xf…

seatunnel hive source 未设置分隔符导致多个字段合并成一个的问题定位解决

seatunnel hive source 未设置分隔符导致多个字段没有切分全保存在一个字段中了,翻看源码发现分隔符是是通过delimiter设置的,只要设置这个delimiter","就可以了。 设置这个属性 delimiter“,” 他的默认值是\u0001,如果没有设置delimiter属性则会根据文件类型判断…

Flink写入数据到Doris

文章目录 1.Doris建表2.Doris依赖3.Bean实体类4.Doris业务写入逻辑5.测试写入类6.发送数据 1.Doris建表 Doris中建表 CREATE TABLE IF NOT EXISTS demo.user (id INT NOT NULL,name VARCHAR(255),age INT ) DISTRIBUTED BY HASH(id) PROPERTIES ("replication_num&qu…

前端工程化第三章:webpack5基础(下)

文章目录 1. TypeScript支持(ts-loader)1.1. ts-loader1.1.1. webpack.config.js1.1.2. tsconfig.json1.1.3. src/index.ts 1.2. 使用babel-loader将ts转换为js1.2.1. webpack.config.js1.2.2. src/index.ts 2. 代码规范检查(Eslint&#xff…

「深度学习之优化算法」(十八)头脑风暴算法

1. 头脑风暴算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   可能大家对“头脑风暴”这个词不怎么熟,毕竟是外来词汇,其大概含义就是分组讨论,畅所欲言。   头脑风暴算法(Brain Storm Optimization)是根据人们进行“头脑风暴”讨论困难问题的解决方案的过…

RabbitMQ消息可靠性问题及解决

说明:在RabbitMQ消息传递过程中,有以下问题: 消息没发到交换机 消息没发到队列 MQ宕机,消息在队列中丢失 消息者接收到消息后,未能正常消费(程序报错),此时消息已在队列中移除 …

Android WiFi框架概览

概览 Android 提供默认 Android 框架实现,其中包括对各种 WLAN 协议和模式的支持,这些协议和模式包括: WLAN 基础架构 (STA)网络共享模式或仅限本地模式下的 WLAN 热点 (Soft AP)WLAN 直连(点对点)WLAN 感知 (NAN)WL…

3.19 Bootstrap 面板(Panels)

文章目录 Bootstrap 面板(Panels)面板标题面板脚注带语境色彩的面板带表格的面板带列表组的面板 Bootstrap 面板(Panels) 本章将讲解 Bootstrap 面板(Panels)。面板组件用于把 DOM 组件插入到一个盒子中。创…

Python采集某网站小视频内容, m3u8视频内容下载

目录标题 前言环境使用:模块使用:代码实现步骤代码展示尾语 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 环境使用: python 3.8 运行代码 pycharm 2021.2 辅助敲代码 模块使用: import requests >>> pip install requests 内置模块 你安装好python环境就…

【机器学习】支持向量机SVM入门

优化目标 相较于之前学习的线性回归和神经网络,支持向量机(Supprot Vector Machine,简称SVM)在拟合复杂的非线性方程的时候拥有更出色的能力,该算法也是十分经典的算法之一。接下来我们需要学习这种算法 首先我们回顾…

ffplay播放器剖析(4)----音频输出和音频重采样流程

文章目录 1. 音频输出模块1.1 音频输出流程1.2 音频输出模型图 2. 打开SDL音频设备audio_open详解sdl_audio_callbackaudio_decode_frame 3. 音频重采样样本补偿 1. 音频输出模块 1.1 音频输出流程 打开SDL音频设备,设置参数启动SDL音频设备播放SDL音频回调函数读取数据,也就…

虚拟仿真实验室未授权获取账号密码

你应该在以后短暂的岁月里,真正活的不负众爱 漏洞描述 虚拟仿真实验室存在未授权访问漏洞,通过访问构造的Url可以获取敏感信息 漏洞复现 访问漏洞url: /admin/student/studentlist.html?page1成功获取所有用户的账号密码信息 文笔生疏…

遥感目标检测(2)--SCRDet

目录 一、概述 二、三个挑战 三、网络结构 1、SF-Net 2、MDA-Net(Multi-Dimensional Attention Network) 3、Rotation Branch 四、损失函数 五、实验 一、概述 SCRDet(Towards More Robust Detection for Small,Cluttered and Rotate…

实验数据origin作图使用经验总结

使用Origin绘制实验数据图表时,可以遵循以下经验总结: 选择合适的图表类型: 根据实验数据的性质和目的,选择合适的图表类型,例如散点图、折线图、柱状图、饼图等。确保图表类型能够清晰地展示数据趋势和关系。 规范坐…

jenkins中运行python脚本时,报错:collecting ... collected 0 items

【问题描述】:jenkins在windows环境下运行python脚本时总是报collecting … collected 0 items 【问题定位】:jenkins工作目录和python文件目录不一样导致 【解决办法】:需要先把路径切换到项目目录下,再进行运行xxx.py文件&…

zabbix钉钉报警

登录钉钉客户端,创建一个群,把需要收到报警信息的人员都拉到这个群内. 然后点击群右上角 的"群机器人"->"添加机器人"->"自定义", 记录该机器人的webhook值。 添加机器人 在钉钉群中,找到只能群助手 添加机器人 选择自定义机…