「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;

    @Override
    protected 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;
    }

	@Override
    protected 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();//clone
        System.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可以直接生成
    @Override
    public 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. 注意区分抽象类和接口

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无法获得dpkg前端锁、Linux之E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?(解决方法)

无法获得dpkg前端锁的解决方法 sudo rm /var/lib/dpkg/lock sudo rm /var/lib/dpkg/lock-frontend sudo rm /var/cache/apt/archives/lock 输入以上三个命令即可解除占用。解除后,继续运行apt命令,已经顺利运行了。解除前端锁后,Linux之E: 无…

.net访问oracle数据库性能问题

问题: 生产环境相同的inser语句在别的非.NET程序相应明显快于.NET程序,执行时间相差比较大,影响正常业务运行,测试环境反而正常。 问题详细诊断过程 问题初步判断诊断过程: 查询插入慢的sql_id 检查对应的执行计划…

20240122面试练习题10

1. Redis为什么执行这么快? 二、Redis为什么这么快? 1、完全基于内存,数据存在内存中,绝大部分请求是纯粹的内存操作,非常快速,跟传统的磁盘文件数据存储相比,避免了通过磁盘IO读取到内存这部分…

配置接口策略路由案例

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle OCP\CKA\K8S\…

如何使用Jellyfin+cpolar搭建私人影音平台实现无公网ip远程访问

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及,各种各样的使用需求也被开发出来&…

jQuery实现选择方法和保护信息方法

最近呢!一直在学习jQuery语法,也没时间发布文章,现在学的差不多了,先跟大家分享下学习感受吧!JavaScript学过后,再学习jQuery语法,应该是简单的,但我总是容易把它们搞混,…

Alzet渗透泵工作原理,你清楚么?

由于Alzet渗透泵独特的释放原理,使得许多化学试剂、药剂或者其他物质,可以通过Alzet渗透泵应用到科研试验中。一个小小的胶囊就可以完成持续的动物给药实验,对于科研实验者来说就是一个福音。 那你了解Alzet渗透泵么?让我们一起来简单了解一…

Android HIDL概述与绑定模式的实现

一、前言 Android O(8.0) 版本之后,底层实现有了比较大的变化,最显著的一个方面就是 HIDL 机制的全面实施。本文对于理解系统源码中 Gnss、Usb、Camera 等模块的工作原理有极大帮助。 二、HIDL 设计目的 在 Android O(8.0) 之前系统的升级牵扯多方协作…

循环购:电商新时代的消费革命

随着电商市场的竞争加剧,消费者需求日益多样化,电商企业需要不断创新以满足市场需求。循环购模式作为一种新兴的消费模式,正逐渐受到消费者的青睐,成为电商行业的新热点。本文将深入剖析循环购模式的魅力,探索其在电商…

chromedriver下载地址与安装方法

用到例如selenium时,需要使用谷歌浏览器并配合chromedriver进行模拟浏览等 分享chromedriver的实时更新的下载网址: https://registry.npmmirror.com/binary.html?pathchromedriver/ 。。。 需要找到自己电脑谷歌浏览器版本所对应的chromedriver版本 …

CQ 社区版 2.8.0 | 支持TiDB、StarRocks,新增列过滤算法、导出模式设置等

Hello,CloudQuery 社区版 2.8.0 已发布,本文将带大家详细解析本次更新的功能~(完整的讲解视频可点击 👉🏻 CloudQuery 社区版2.8.0 功能讲解演示 本期亮点更新 新增支持数据源 TiDB、StarRocks数据保护新增列过滤脱敏…

HNSW算法

From: HNSW算法(nsmlib/hnswlib)-CSDN博客HNSW算法的基本原理及使用 - 知乎 HNSW是一种广泛使用的ANN图索引结构,包括DiskANN、DF-GAS、SmartSSD等。本文档主要总结HNSW的结构与工作流程,便于后期研究其工作流程在迁移到CSD中存在的I/O问题…

计算CNN卷积层和全连接层的参数量

计算CNN卷积层和全连接层的参数量 先前阅读 CNN ExplainerA Comprehensive Guide to Convolutional Neural Networks — the ELI5 way 本文主旨意在搞明白2个问题: 第一个问题 一个卷积操作,他的参数,也就是我们要训练的参数,也…

50. Pow(x, n)

分治算法: 从右往左开始递归计算,假设yx^(n/2),那么当n为偶数时,x^ny*y,当n为奇数时,x^ny*y*x。 另外,注意n有可能是负数。 class Solution {public double myPow(double x, int n) {int N n…

Kettle-Docker部署+Sqlserver数据同步Mysql+Start定时任务

一. 背景介绍 1. ETL是什么 ETL(Extract-Transform-Load),即数据抽取、转换、装载的过程。它是一种思想,主要是说,从不同的数据源获取数据,并通过对数据进行处理(格式,协议等转换&a…

ChatGPT 全域调教高手:成为人工智能交流专家

随着人工智能的快速发展,ChatGPT作为一种强大的文本生成模型,在各行各业中越来越受到重视和应用。想要利用ChatGPT实现更加智能、自然的交流,成为 ChatGPT 全域调教高手吗?本文将为您介绍如何通过优化ChatGPT的训练方法&#xff0…

全新5IUX极简搜索主页源码 /自定义浏览器主页

源码介绍: 全新5IUX极简搜索主页源码,专为自定义浏览器主页而设计。厌倦了各种导航首页上满屏幕的广告和资讯,可以自己尝试编写一个个性化的主页。这款源码并非镜像或代理,而是作为浏览器主页使用,同时支持自适应屏幕…

springboot快速写接口

1. 建proj形式 name会变成文件夹的名字,相当于你的项目名称 基础包 2. 基础依赖 3. 配置数据库 这里要打开mysql,并且创建数据库 方法: 安装好数据库,改好账号密码用navicat来建表和账号配置properties.yml文件即可 4.用res…

基于SpringBoot的玩具租赁系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

腾讯云轻量应用Windows服务器如何搭建幻兽帕鲁Palworld私服?

幻兽帕鲁/Palworld是一款2024年Pocketpair开发的开放世界生存制作游戏,在帕鲁的世界,玩家可以选择与神奇的生物“帕鲁”一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。而帕鲁可以进行战斗、繁殖、协助玩家做农活,也…