「JavaSE」抽象类接口3

news2024/11/16 21:51:00

🎇个人主页: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. 注意区分抽象类和接口

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

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

相关文章

Effective C++ 学习

Effective C浅浅学习,很多不太理解 尽量用const, enum, inline 替换#define尽可能使用const确认对象在使用前就已经被初始化构造,析构,赋值运算,拷贝构造为多态基类声明virtual析构函数不要让析构函数抛出异常不在构造和析构过程中…

javaWebssh宠物基地管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh宠物基地管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

跨平台Recorder录音插件:支持多种格式、音频可视化、实时上传、语音识别

视频教程地址:【跨平台Recorder录音插件:支持多种格式、音频可视化、实时上传、语音识别】 https://www.bilibili.com/video/BV1jQ4y1c7e4/?share_sourcecopy_web&vd_sourcee66c0e33402a09ca7ae1f0ed3d5ecf7c /** 先引入Recorder ( 需先…

幻兽帕鲁服务器数据备份

搭建幻兽帕鲁个人服务器,最近不少用户碰到内存不足、游戏坏档之类的问题。做好定时备份,才能轻松快速恢复游戏进度 这里讲一下如何定时将服务器数据备份到腾讯云轻量对象存储服务,以及如何在有需要的时候进行数据恢复。服务器中间的数据迁移…

CI/CD

介绍一下CI/CD CI/CD的出现改变了开发人员和测试人员发布软件的方式,从最初的瀑布模型,到最后的敏捷开发(Agile Development),再到今天的DevOps,这是现代开发人员构建出色产品的技术路线 随着DevOps的兴起,出现了持续集成,持续交付和持续部署的新方法,传统的软件开发和交付方…

一文学习Thrift RPC

Thrift RPC引言 Thrift RPC的特点 Thrift 是一个RPC的框架,和Hessian RPC有什么区别,最重要的区别是Thrift可以做异构系统开发。 什么是异构系统,服务的提供者和服务的调用者是用不同语言开发的。 为什么会当前系统会有异构系统的调用&…

Vue3 Teleport 将组件传送到外层DOM位置

✨ 专栏介绍 在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使…

音频前置放大器电路图大全

音频前置放大器电路图(一) 在本设计中,前置放大器的增益控制采用直流音量控制方式,其具体实现如图1所示。前置放大器是由全差分运放和电阻构成的反相比例放大器,其增益由反馈电阻与输人电阻的比值决定。外部输人的直流…

【Leetcode】2859. 计算 K 置位下标对应元素的和

文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 请你用整数形式返回 nums 中的特定元素之和 ,这些特定元素满足:其对应下标的二进制表示中恰存在 k 个置位。 整数的二进制表示中的 1 就是这个整数的…

WebSocket实现HTML+SpringBoot聊天功能,小程序+SpringBoot聊天功能

目录 一、认识WebSocket 二、HTML实现聊天 三、微信小程序实现聊天 一、认识WebSocket 1.首先博主在初学Java时自我感觉走了很多弯路,因为以前见识短,在接触聊天功能时根本就没能想到有WebSocket这个聊天框架,就只能用底层的UDP或TCP实现聊…

基于Spring Boot的饮食分享平台设计与实现

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

vue项目打包部署到服务器并使用cdn加速

配置 vue.config.js文件 const isProd process.env.NODE_ENV production module.exports {// 其他配置chainWebpack: config > {// 生产环境下使用CDNif (isProd) {config.plugin(html).tap(args > {args[0].cdn assetsCDNreturn args})}},// 生产环境下替换路径为c…

第十二回 急先锋东郭争功 青面兽北京斗武-FreeBSD/Linux SSH配置和常用软件

周谨和杨志第一轮比枪,为了安全,将枪尖去掉,包上柔软的毡片,再蘸满石灰。两人打了四五十个回合,只见周谨身上斑斑点点,约有三五十处,而杨志身上只有左肩牌下一点白。 周谨不服又来比射箭&#x…

如何在云服务上通过docker部署服务?

如何在云服务上通过docker部署服务? 一、在云服务器上安装Docker1、查看云服务器的OS信息2、[安装Docker并使用(Linux)](https://help.aliyun.com/zh/ecs/use-cases/deploy-and-use-docker-on-alibaba-cloud-linux-2-instances) 二、通过dock…

互斥锁/读写锁(Linux)

一、互斥锁 临界资源概念: 不能同时访问的资源,比如写文件,只能由一个线程写,同时写会写乱。 比如外设打印机,打印的时候只能由一个程序使用。 外设基本上都是不能共享的资源。 生活中比如卫生间,同一…

视频尺寸魔方:分层遮掩3D扩散模型在视频尺寸延展的应用

▐ 摘要 视频延展(Video Outpainting)是对视频的边界进行扩展的任务。与图像延展不同,视频延展需要考虑到填充区域的时序一致性,这使得问题更具挑战性。在本文中,我们介绍了一个新颖的基于扩散模型的视频尺寸延展方法——分层遮掩3D扩散模型(…

Apollo Cyber RT:引领实时操作系统在自动驾驶领域的创新

🎬 鸽芷咕:个人主页 🔥 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…

Linux的常见指令和基本操作演绎【复习篇章一】

文章目录 前言下载安装 XShellXShell 下的复制粘贴热键操作01.ls指令tree 02.cd指令03.touch指令04.mkdir指令(重要):05.rmdir指令 && rm 指令(重要)06.组合07.man指令(重要)&#xff1…

【lodash.js】非常好用高性能的 JavaScript 实用工具库,防抖,深克隆,排序等

前言:lodash是一款前端必须要知道的js库,它里面提供了许多常用的功能和实用的工具函数 基本上我参与的项目中都有lodash,只能说lodash太强大了,lodash.js 提供了超过 300 个实用的工具函数,涵盖了很多常见的编程任务 l…

群辉NAS的远程访问

群辉NAS是私有云存储,局域网访问很容易【详见:网上邻居访问设置、其它设备的访问设置】,远程访问相对复杂,涉及很多关键因素,现将过程记录如下: 目录 1、互联网接入 2、绑定MAC与IP地址 3、路由器开启5…