Cloneable 接口和深拷贝,浅拷贝

news2024/11/19 22:36:20

目录

一.Cloneable 接口

二.浅拷贝

三.深拷贝

四.comparable接口、

五.comparator接口

1.Java 中内置了一些很有用的接口 , Cloneable 就是其中之一 . Object 中存在一个 clone 方法 , 调用这个方法可以创建一个对象的 " 拷贝 ".
2.来说说调用 clone 方法的注意事项:首先要先 实现Cloneable 接口,然后 重写克隆方法,这里我们会发现, Cloneable 是个空接口,就因为是,空接口才可以被继承。 注意异常,还有向下转型

二.浅拷贝:

如下代码,我们可以看到,通过clone,我们只是拷贝了Person对象。但是Person对象中的Money对象,并没有拷贝。

代码:

class Money implements Cloneable {
    public double m = 10.9;

    @Override
    protected Object clone()
            throws CloneNotSupportedException {
        return super.clone();
    }

}
public class Person implements Cloneable {
    public String name;
    public int age;
    Money money = new Money();

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

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

    @Override
    protected Object clone()  //注:谁调用了clone方法,谁就是this(Test中person1调用了clone)
            throws CloneNotSupportedException {
        return super.clone();
       
    }
}


public class Test {
    public static void main(String[] args)
            throws CloneNotSupportedException {
        //浅拷贝
     Person person1 = new Person("lili", 2);
     Person person2 = (Person) person1.clone();
        System.out.println(person2);

        System.out.println("修改前" + person1.money.m);
        System.out.println("修改前" + person2.money.m);

        person2.money.m = 20.9;
        System.out.println("修改后" + person1.money.m);
        System.out.println("修改后" + person2.money.m);
}

画了一个图可以这样理解:这里结果反应了浅拷贝

三.深拷贝:我们可以看到,通过clone,我们既拷贝Person对象。这里注意:(我们通过,persion1对象money的引用,来克隆(不要忘记向下转型)。

)拷贝Person对象中的Money对象,并没有拷贝。

代码如下:

class Money implements Cloneable {
    public double m = 10.9;

    @Override
    protected Object clone()
            throws CloneNotSupportedException {
        return super.clone();
    }

}
public class Person implements Cloneable {
    public String name;
    public int age;
    Money money = new Money();

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

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

    @Override
    protected Object clone()  //注:谁调用了clone方法,谁就是this(Test中person1调用了clone)
            throws CloneNotSupportedException {
        Person tmp = (Person)super.clone();
        tmp.money = (Money)this.money.clone();//通过对象(.)引用(.)克隆(通过引用修改)
         return tmp;
    }
}




public class Test {
    public static void main(String[] args)
            throws CloneNotSupportedException {

        //深拷贝
        Person person1 = new Person("lili", 2);
        Person person2 = (Person) person1.clone();
        System.out.println(person2);

        System.out.println("修改前" + person1.money.m);
        System.out.println("修改前" + person2.money.m);

        person2.money.m = 20.9;
        System.out.println("修改后" + person1.money.m);
        System.out.println("修改后" + person2.money.m);
    }
}

 这是我对深拷贝的理解:结果反应深拷贝

四.comparable接口:

1.使用:涉及到自定义类型比较可以用,comparable接口:

2.实现接口并重写compareTo方法,注意:泛型哪里,计较哪个对象就写,哪个对象,还有这里我们自己,写了一个排序方法,通过sort,调用compareTo方法,我们会传入Student对象,这里this和O,是我们,比较的学生对象。

3.这里我们自己模拟了,被调接口里的排序方法(我们默认升序写法)。当然也可以用,接口本来比较,复杂的方法。

通过传入,接口来规范我们,达到,不同对象都可以用的,作用

public static void mySort(Comparable[] comparable) {  //这里用接口类型的数组接受,只要接口里有对应的方法,就可以通过实例化,这个接口类型的数组,来调用对应方法
        for (int i = 0; i < comparable.length-1; i++) {
            for (int j = 0; j < comparable.length-1-i; j++) {
                /**
                 * 注意:数组是引用类型(相当于地址),不可以这样比较(comparable[j] > comparable[j+1])
                 */

                if (comparable[j].compareTo(comparable[j+1]) > 0) {
                    Comparable tmp = comparable[j];
                    comparable[j] = comparable[j+1];
                    comparable[j+1] = tmp;
                }
            }
        }
    }

下面给代码现象:

4.这个接口,也有缺陷,比较较为固定(要自己单独更换,重写方法,里的比较方式),接下来我们换一个接口。

五.comparator接口:(这个接口,我们可以单独,自己写一类,构造器)

1.使用:这里排序方法还是用我们自己写的

2.重写compare方法:(这里我们的,NameComparator就是,一个构造器,为什么呢?就是我们这里规定,自定义Name来比较。)

main方法里的代码:

public static void main(String[] args) {
        NameComparator nameComparator = new NameComparator();

        Student[] student =  new Student[3];
        student[0] = new Student("wada", 8);
        student[1] = new Student("lili", 9);
        student[2] = new Student("huahua", 10);


        System.out.println("排序前" + Arrays.toString(student));


        Arrays.sort(student, nameComparator);//这里要,多传一个,构造器对象
        System.out.println("排序后" + Arrays.toString(student));



    }

结果:

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

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

相关文章

基于大型语言模型的游戏智能体

在人工智能领域&#xff0c;游戏代理的发展对于实现通用人工智能&#xff08;AGI&#xff09;至关重要。近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;及其多模态版本&#xff08;MLLMs&#xff09;的进展为游戏代理的进化和能力提升提供了前所未有的机遇。这些…

Django自定义模板标签与过滤器

title: Django自定义模板标签与过滤器 date: 2024/5/17 18:00:02 updated: 2024/5/17 18:00:02 categories: 后端开发 tags: Django模版自定义标签过滤器开发模板语法Python后端前端集成Web组件 Django模板系统基础 1. Django模板语言概述 Django模板语言&#xff08;DTL&…

Elasticsearch 分析器的高级用法二(停用词,拼音搜索)

Elasticsearch 分析器的高级用法二&#xff08;停用词&#xff0c;拼音搜索&#xff09; 停用词简介停用词分词过滤器自定义停用词分词过滤器内置分析器的停用词过滤器注意&#xff0c;有一个细节 拼音搜索安装使用相关配置 停用词 简介 停用词是指&#xff0c;在被分词后的词…

巨亏22亿还能上市?瑞幸为何越亏越值钱?剖析资本破局的商业思维

瑞幸咖啡 18个月登上纳斯达克 13个月退市 19个月&#xff0c;粉单市场股价再次翻了8倍 这个技术性“上市”无常的产品是谁&#xff1f; 其实现在这个笑贫不笑娼的社会 如果我说&#xff1a;我们公司上市了&#xff0c;悲催又退市了。我朋友会说&#xff1a;工资没降吧?…

信创数据库有哪些?哪家好?堡垒机支持吗?

当今时代&#xff0c;数据已经成为了企业最宝贵的资产&#xff0c;因此数据库厂商也是不断增加。这不不少小伙伴在问&#xff0c;信创数据库有哪些&#xff1f;哪家好&#xff1f;堡垒机支持吗&#xff1f; 信创数据库有哪些&#xff1f; 1、达梦数据库 2、openGauss 3、人大…

Mac Pro中的开源虚拟机UTM安装ubuntu(Applce M1,M2芯片)(1)

UTM安装ubuntu&#xff08;Applce M1&#xff0c;M2芯片&#xff09;(2)链接: https://blog.csdn.net/qq_38382925/article/details/139158763?spm1001.2014.3001.5502 MacPro安装UTM 1 UTM 下载UTM虚拟机链接: https://mac.getutm.app/ 建议官网下载&#xff1a; 下载 U…

Codesys软件做EtherNET/IP主站与HT3S-EIS-MDN网关通讯步骤

Codesys软件做EtherNET/IP主站与HT3S-EIS-MDN网关通讯步骤 打开codesys软件&#xff0c;新建项目&#xff0c;选择标准项目进入界面后选择CODESYS Control Win v3 x64 &#xff0c;点击确定。 3.在桌面找到显示隐藏图标&#xff0c;找到如下图所示图标&#xff0c;右击在弹出…

查看bond接口详细信息

cat /proc/net/bonding/bondX 命令用于查看 Linux 系统中的网络绑定&#xff08;bonding&#xff09;接口的详细信息。在该命令中&#xff0c;bondX 是网络绑定接口的名称&#xff0c;其中 X 是数字&#xff0c;表示具体的网络绑定接口编号。 输出内容详解&#xff1a; 1. E…

java面试框架篇(Spring常见问题、SpringBoot、SpringMVC、mybatis经典问题、SpringCloud组件)

文章目录 面试专题-java框架篇1. spring常见问题1.1. spring是什么?1.2. 谈谈你对AOP的理解1.3. 谈谈你对IOC的理解1.4. Spring Boot、 Spring MVC和Spring有什么区别1.5. spring bean 生命周期1.6. spring事务传播机制有哪些?1.7. 循环依赖1.8. spring框架中使用了哪些设计模…

并网逆变器学习笔记9---VSG控制

参考文献&#xff1a;《新型电力系统主动构网机理与技术路径》 “构网技术一般包含下垂控制&#xff0c;功率同步控制&#xff0c;虚拟同步机控制&#xff0c;直接功率控制&#xff0c;虚拟振荡器控制 等。其中&#xff0c;虚拟同步机技术&#xff0c;即 VSG&#xff0c;因其物…

webgl开发家居设计软件

WebGL是一种在网页浏览器中渲染3D图形的JavaScript API&#xff0c;它基于OpenGL ES标准&#xff0c;允许开发者创建和显示交互式的3D图形。开发基于WebGL的家居设计软件可以为用户提供一种全新的、沉浸式的家居设计体验。以下是开发此类软件的一些关键步骤和特点。北京木奇移动…

【问题记录】QT“类型强制转换“:无法从“ATL::CString“转换为“LPCWSTR“

一&#xff0c;问题现象 环境&#xff1a;VS2019QT 报错提示&#xff1a;“类型强制转换”&#xff1a;无法从"ATL::CString"转换为"LPCWSTR" 二&#xff0c;解决方法 打开项目属性&#xff0c;设置字符集&#xff0c;如下所示&#xff1a;

某勾求职网逆向分析

搜索目标: aHR0cHM6Ly93d3cubGFnb3UuY29tL3duL2pvYnM/cG49MSZweD1kZWZhdWx0JmZyb21TZWFyY2g9dHJ1ZSZrZD0lRTYlOTUlQjAlRTYlOEQlQUUlRTUlODglODYlRTYlOUUlOTA= 抓包分析 请求和返回都是加密的 请求头部也有未知参数 跟栈分析 请求和返回是一个AES加密,加密的KEY是session s…

ruoyi前端获取用户信息

vue中获取当前用户信息 &#xff1a;头像&#xff0c;用户名&#xff0c;id&#xff0c;权限&#xff0c;token等 // 获取当前用户信息 用户名等var user this.$store.state.user;console.log("用户信息####", user);

DLRover:蚂蚁集团开源的AI训练革命

在当前的深度学习领域&#xff0c;大规模训练作业面临着一系列挑战。首先&#xff0c;硬件故障或软件错误导致的停机时间会严重影响训练效率和进度。其次&#xff0c;传统的检查点机制在大规模训练中效率低下&#xff0c;耗时长且容易降低训练的有效时间。资源管理的复杂性也给…

Nginx(负载均衡,反向代理)

1.什么是nginx Nginx&#xff08;“engine x”&#xff09;是一个高性能的HTTP和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;**并发**能力强&#xff0c;事实上Nginx的并发能力确实在同类型的网页服务器中表现较好&#xff0c;中国大陆使用Nginx网站用户有&#…

Codeforces Round 943 (Div. 3)

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 Codeforces Round 943 (Div. 3) 题解 题目列表&#xff1a;https://codeforces.com/contest/1968 A https://codeforces.com/contest/1968/problem/A 题目大意 给…

【教学类-58-01】黑白三角拼图01(2*2宫格)256种

背景需求&#xff1a; 中班益智区素材&#xff1a;三角形变魔术 - 小红书自制益智区教玩具&#xff1a;三角形变魔术&#xff0c;共24题 玩法一&#xff1a;根据图示在空白格子里摆放。 玩法二&#xff1a;根据图示在空白格子里用黑笔涂。##自制玩具益智区 #幼儿园益智区 #中班…

Color预设颜色测试

"AliceBlue", "获取 ARGB 值为 的系统 #FFF0F8FF定义颜色。", "AntiqueWhite", "获取 ARGB 值为 的系统 #FFFAEBD7定义颜色。", "Aqua", "获取 ARGB 值为 的系统 #FF00FFFF定义颜色。", "Aquamarine"…

.NET File Upload

VS2022 .NET8 &#x1f4be;基础上传示例 view {ViewData["Title"] "File Upload"; }<h1>ViewData["Title"]</h1><form method"post" enctype"multipart/form-data" action"/Home/UploadFile"…