「JavaSE」抽象类接口3

🎇个人主页:Ice_Sugar_7
🎇所属专栏:快来卷Java啦
🎇欢迎点赞收藏加关注哦!

抽象类&接口3

  • 🍉Clonable 接口和深拷贝
    • 🍌浅拷贝和深拷贝
  • 🍉Object类
  • 🍉抽象类和接口的区别
  • 🍉总结

🍉Clonable 接口和深拷贝

Object 类中存在一个 clone 方法,调用这个方法可以创建一个对象的拷贝
要调用 clone 方法,需要先实现 Clonable 接口,否则就会抛出 CloneNotSupportedException 异常(不支持克隆异常)

🍌浅拷贝和深拷贝

Cloneable拷贝出的对象是一份浅拷贝,下面用一个例子来解释一下:

class Money implements Cloneable{public double m = 19.9;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}class Person implements Cloneable{public String name;public int age;public Money money = new Money();  //实例化一个Money对象public Person(String name, int age) {this.name = name;this.age = age;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}class Test {public static void main(String[] args) throws CloneNotSupportedException {Person person = new Person("张三",20);Person person2 = (Person)person.clone();//cloneSystem.out.println("person "+person.money.m);System.out.println("person2 "+person2.money.m);System.out.println("===========");person.money.m = 100;//观察将m修改为100之后两个对象的m是多少System.out.println("person "+person.money.m);System.out.println("person2 "+person2.money.m);}
}

在这里插入图片描述
可以看到两个对象的m都变为100.0,说明person、person2的money都指向同一个m
在这里插入图片描述

由此我们可以总结浅拷贝的特征:
浅拷贝会创建一个新对象,但是对于引用类型的字段,只复制了引用,而不是复制引用指向的对象

而深拷贝就会复制引用所指对象
现在想实现深拷贝,我们就要给money也拷贝一份,需要把Person的clone方法改一下:

    protected Object clone() throws CloneNotSupportedException {Person tmp = (Person) super.clone();  //对原对象进行克隆tmp.money = (Money) this.money.clone();  //克隆对象中引用类型所指的对象return tmp;}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
深拷贝后,再修改person的m,就不会影响person2的了
在这里插入图片描述


🍉Object类

Object是Java默认提供的一个类,Java中所有类默认继承Object父类。即所有类的对象都可以使用Object的引用进行接收,举个例子:

    public static void func(Object obj) {System.out.println(obj);}public static void main(String[] args) {func(new Student("Sugar",90));func(new Money());}

在这里插入图片描述
Object类中也有一些定义好的方法,本文讲解其中的 toString( ) 和 equals( )
在这里插入图片描述

  1. toString( )
    如果要打印对象中的内容,就需要重写Object类中的toString()方法,不然会打印出它的地址(内存地址的字符串表示形式)
// Object类中的toString()方法实现:
public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
  1. equals( )
    我们常见的==就可以实现比较,它在比较时:
    如果它左右操作数是基本类型变量,比较的是变量中值是否相同
    如果左右两侧是引用类型变量,则比较引用变量地址是否相同

要比较对象的内容是否相等,那就要用到equals方法,但是需要进行重写,因为它默认按地址进行比较的

// Object类中的equals方法
public boolean equals(Object obj) {return (this == obj); // 使用引用中的地址直接来进行比较
}
	//Student类中重写equals,用idea的generate可以直接生成@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return grade == student.grade;}public static void main(String[] args) {Student student1 = new Student("砂糖橘",98);Student student2 = new Student("zs",98);boolean ret = student1.equals(student2);System.out.println(ret);  //运行结果为true}

🍉抽象类和接口的区别

抽象类和接口都是 Java 中多态的常见使用方式,都需要重点掌握,同时也需要了解二者之间的区别
核心区别

  • 抽象类中可以包含普通方法和字段,这样的普通方法和字段可以被子类直接使用(不必重写)
  • 而接口中不能包含普通方法,子类必须重写所有的抽象方法

在这里插入图片描述


🍉总结

  1. Cloneable接口的clone方法可以实现浅拷贝,如果要实现深拷贝,那么让需要对对象中的引用类型进行拷贝
  2. Java中默认Object类是所有类的父类。Object中已经实现了一些方法,子类通过重写这些方法可以实现相应的功能
  3. 注意区分抽象类和接口

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

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

相关文章

HCIP-BGP实验

实验拓扑 实验需求 1.r1上有两个换汇分别为192.168.1.0/24和192.168.2.0/24只允许学到汇总和1.0 2.r7上有两个还回172.16.1.0/24和172.16.2.0/24要求全部宣告,但是只有2.0可以通过 3.全网可达 实验思路 配置IP地址 BGP配置 实验步骤 配置IP地址 BGP配置 在…

RabbitMQ死信交换机

目录 1.死信交换机介绍 2.TTL 3.延迟队列 4.消息堆积问题 5.惰性队列 6.代码实战 1.死信交换机介绍 当一个队列中信息满足下列情况之一时,可以成为死信(dead letter) (1)消费者使用basic.reject(Reject…

【mongoDB】集合的创建和删除

目录 1.集合的创建 2. 查看所有集合 3.删除集合 1.集合的创建 格式: db.createCollection ( name ) 例如创建一个名为 bbb 的集合 还可以通过传递一个选项对象来指定集合的属性,例如最大文档的大小,索引选项等 例如 这样创建了一个名为 cc…

如何在IntelliJ IDEA数据库控制台操作Redis

如何在IntelliJ IDEA数据库控制台操作Redis TIPS 本文理论支持IntelliJ IDEA家族所有IDE(例如Data Grip等)、所有版本理论支持所有基于JDBC的各种GUI工具! 最近工作中,经常要操作到Redis,尽管市面上的Redis客户端GUI非…

算法基础之树状数组

文章目录 树状数组 树状数组 树状数组能解决的最关键的问题就是能够 O ( log ⁡ n ) O(\log n) O(logn)内,给某个位置上的数,加上一个数,或者求前缀和 他和前缀和数组的区别就是,树状数组支持修改原数组的内容,而前缀…

C语言第九弹---二维数组

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 二维数组 1、二维数组的创建 1.1、二维数组的概念 ​1.2、⼆维数组的创建 2、二维数组的初始化 2.1、不完全初始化 ​2.2、完全初始化 ​2.3、按照行初始化 ​2.4、…

如何使用Docker安装Spug并实现远程访问本地运维管理界面

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件…

Vue开发之proxy代理的配置(附带uniapp代理配置)

vue 1.在vue.config.js中添加 devServer 属性中配置 proxy 属性 module.exports {productionSourceMap: false,publicPath: /,devServer: {port: 8085,proxy: {/api/admin: {target: http://10.58.104.70:6111,changeOrigin: true,pathRewrite: {/api/: /}},/api: {target: …

UE创建数据表格

创建一个数据表格需要行结构 继承自FTableRowBase的一个子类 效果 如何使用它 在蓝图中给C该类型的指针变量选用 UDataTable类型的 FindRow()函数可查询并返回对应行的行结构 FTableRowBase GetAllRows()函数可以获得该数据表的所有行、

centos 安装mysql5.7教程

一,配置yum mysql5.7安装源 配置yum mysql5.7安装源 yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 配置mysql5.7安装源成功 查看配置成功的安装源 yum repolist enabled | grep "mysql*" 执行后看到已配…

环境监测与预报:探索天气预报查询API在生态保护中的作用

摘要 随着全球气候变化的加剧,生态保护已成为全球关注的焦点。天气预报API作为一种强大的工具,不仅能够提供实时的气象数据,还能在生态保护领域发挥重要作用。本文将探讨天气预报API如何帮助科学家、环保组织和政策制定者更好地理解和预测环…

什么是 Docker

1.什么是 Docker 1.1 官方定义 最新官网首页 # 1.官方介绍 - We have a complete container solution for you - no matter who you are and where you are on your containerization journey. - 翻译: 我们为你提供了一个完整的容器解决方案,不管你是谁,不管你在哪,你都可以…

conda-建立多个python环境

1. 安装 下载地址:Miniconda — miniconda documentation 2. 安装好了会自动配置环境变量,如果没有配置手动配置 3. 检查conda环境 4. 设置conda配置文件 在‪C:\Users\Administrator下新建文件【.condarc】 channels: //镜像地址- https://mirrors.…

girhub添加 SSH 密钥

1 打开终端 输入 ssh-keygen -t rsa -b 4096 -C "github邮箱地址"如果不需要密码可以一路回车 出现这个页面就是生存成功了 open ~/.ssh // 打开.ssh 找到id_rsa.pub复制出内容新建ssh密钥输入内容,保存即可

MacOS平台翻译OCR软件,双管齐下,还可自定义插件,为其添砖加瓦!

小编昨天为大家分享了Windows系统下的一款功能强大且免费的 OCR 开源工具 Umi-OCR。 今天则为大家推荐一款 MacOS系统下的一款 翻译 OCR 多功能双管齐下的桌面应用软件 Bob。这款软件虽然也上线了GitHub,但它不是一款开源软件,仓库只是作者为了用户反馈…

Mac M1 Parallels CentOS7.9 Deploy 禅道

禅道官网下载地址: https://www.zentao.net/download/max4.10-83276.html 一、官网下载 二、解压安装 将下载好的包传至CentOS7.9虚拟机 zhinian192 ~ % scp Downloads/ZenTaoPMS-max4.10-zbox_arm64.tar.gz root10.211.55.36:~ ZenTaoPMS-max4.10-zbox_arm64.tar.gz …

idea 打包跳过测试

IDEA操作 点击蓝色的小球 手动命令 mvn clean package -Dmaven.test.skiptrue# 下载源码![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ff15aad1c9a546b6ab0556b5b135f409.png)

Linux命令拓展

一、tr - 字符转换 效果展示: 将小写转换成大写 字符压缩 通式:tr -s 字符删除 通式:tr -d 补集 通式:tr -c 用法:随机密码 二、cut - 提取 通式:cut [选项] 文件 选项: -d:分隔符…

C语言实现归并排序算法(附带源代码)

归并排序 把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。 可从上到下或从下到上进行。 动态效果过程演示: 归并排序(Merge Sort)是一种分治算法,它将一个数组分为两个子数组,分别对这两个…

VS2022联合Qt5开发学习10(QT5.12.3联合VTK在VS2022上开发医学图像项目4——ScrollBar控制对比度、切面位置)

这篇博文是接着VS2022联合Qt5开发学习7(QT5.12.3联合VTK在VS2022上开发医学图像项目2——十字叉标注)-CSDN博客这篇博文延伸开发医学图像的显示渲染相关项目,主要介绍的是在之前显示的图像上增加滑块控制。 用到的内容有: VS2022…