「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,一经查实,立即删除!

相关文章

Leetcode131.分割回文串-Palindrome Patitioning-Python-回溯法

解题思路: 1.切割回文串,可以用解决找组合问题的思路解决,而解决组合问题,可以用回溯法,故本题选择回溯法。 2.理解两个事情:1.递归函数里的for循环是横向遍历给定字符串s的每一个字母。2.针对s的每一个字…

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…

React16源码: React中commit阶段的commitRoot的主流程源码实现

commitRoot 1 )概述 在react中有 render 阶段 和 commit 阶段,这是两个不同的阶段1 )之前的渲染更新都是render阶段在render阶段,会经历一系列的调度,一系列的节点的更新过程需要去重新计算它的 state, props 生成新的…

SimpleDateFormat学习使用

提起SimpleDateFormat类,想必做过Java开发的童鞋都不会感到陌生。没错,它就是Java中提供的日期时间的转化类。这里, 为什么说SimpleDateFormat类有线程安全问题呢?有些小伙伴可能会提出疑问:我们生产环境上一直在使用S…

【mongoDB】集合的创建和删除

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

Linux CentOS使用Docker搭建laravel项目环境(实践案例详细说明)

一、安装docker # 1、更新系统软件包: sudo yum update# 2、安装Docker依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 3、添加Docker的yum源: sudo yum-config-manager --add-repo https://download.docker.com/linux/cen…

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

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

kotlin 项目中文件显示带.kt 结尾与不带.kt结尾

kotlin 项目中文件显示带.kt 结尾与不带.kt结尾,而且显示的图片也不一样, 首先说下,这个只是开发工具上的一个设计细节展示,无论显示效果是否带.kt 实际的文件都是带.kt结尾的,这个可以到文件的目录下查看文件 创建文…

算法基础之树状数组

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

代码随想录算法训练营第30天(回溯算法06 | ● 332.重新安排行程 ● 51. N皇后 ● 37. 解数独 ● 总结

回溯算法06 332.重新安排行程(可跳过)解题思路难点 51.N皇后(可跳过)解题思路回溯三部曲难点 5. 解数独(可跳过)解题思路回溯三部曲 总结篇(没来及看 332.重新安排行程(可跳过&#…

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: …

自动 卸载或安装 Python第三方库

在调用 pip.exe 时,可以使用相对路径也可以使用绝对路径 路径中如果包含空格,最好使用相对路径,这就要求 pip.exe 所在文件夹设置为环境变量 可以参考: Windows下将文件夹设置为环境变量 echo off setlocal enabledelayedexpansi…

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. - 翻译: 我们为你提供了一个完整的容器解决方案,不管你是谁,不管你在哪,你都可以…

vue3常用代码

文章目录 监听路由vue3 警告Feature flag __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.mitt、project/inject 无效解决方案 菜鸟做项目时发现很多 vue3 常用的代码,所以来总结一下! 监听路由 import { useRoute } from "…