3000字帮你彻底搞懂Java抽象类与接口的区别(含JDK8接口新增三种方法与丰富案例)

Java-OOP

1-Final

1.1简介

final关键字是最终的意思,可以修饰:类、方法、变量。

  • 修饰类:该类被成为最终类,特点是不能被继承了。
  • 修饰方法:该方法被称为最终方法,特点是不能被重写了。
  • 修饰变量:该变量有且仅能被赋值一次。

1.2注意

  • final修饰基本类型的变量,变量存储的数据不能被改变。
  • final修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向对象的内容可以被改变。

final修饰类,不可被继承。

在这里插入图片描述

工具类中的方法添加final,会显得你的程序更加优雅。

在这里插入图片描述

final可以用于保护成员变量。

在这里插入图片描述

1.3常量

  • 使用了static final 修饰的成员变量就被称为常量。
  • 作用:常用于记录系统的配置信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用常量记录系统配置信息的优势、执行原理

  • 代码可读性更好,可维护性也更好。

  • 程序编译后,常量会被“宏替换”:出现常量的地方全部会被替换成其记住的字面量,这样可以保证使用常量和直接用字面量的性能是一样的。


2-单例类(设计模式)

  • 一个问题通常有n种解法,其中有一个解法是最优解,这个最优解法被人总结出来,称之为设计模式。
  • 设计模式有20多种,对应20多种软件开发中会遇到的问题。

关于设计模式,主要学什么?

  • 解决什么问题?
  • 怎么写?

2.1单例设计模式

  • 作用:确保某个类只能创建一个对象。
  • 经典例子:系统控制器
2.1.1饿汉式单例写法-实现步骤

把类的构造器私有。

定义一个类变量记住类的一个对象。

定义一个类方法,返回对象。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是这种实现方法并不专业,因为如果我们如果执行如下操作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就会输出null,所以我们可以直接在定义A类时添加final

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

或者我们可以把public修改为private,但是我们需要再新写一个方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单例有很多形式,我们刚才举例的是饿汉式单例:拿对象时,对象早就创建好了,接下来我们讲一下懒汉式单例。

2.1.2懒汉式单例

简介:用对象时,才开始创建对象。

写法:

把类的构造器私有。

定义一个静态变量用于存储对象。

提供一个静态方法,保证返回的是同一个对象。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

没有谁好谁坏,只是涉及到具体案例的选择不同,相对来说,第一次拿对象时,饿汉式是比懒汉式更快的,但是如果一个类始终不被使用,但是饿汉式已经创建了。


3-枚举类

  • 枚举类是一种特殊类。
3.1枚举类的写法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特点:

  • 枚举类中的第一行,只能写枚举类的对象名称,并且要用逗号隔开。
  • 这些名称,本质是常量,每个常量都记住了枚举类的一个对象。
  • 枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。
  • 编译器为枚举类新增了几个方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.2枚举类的常见应用场景

枚举类很适合做信息分类和标志。

比如我们现在要做一个用户输入上下左右移动的案例,我们有两种办法,第一种就是拿常量做,第二种就是拿枚举做。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果使用枚举做

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们在使用程序的时候就只能按照枚举类中的四个值使用,我们的参数值会受到枚举类的约束。


4-抽象类

在java中有一个关键字叫:abstract,它就是抽象的意思,可以用它修饰类、成员方法。

  • abstract修饰类,这个类就是抽象类。
  • abstract修饰方法,这个方法就是抽象方法。

4.1抽象类的注意事项、特点

  • 抽象类不一定要有抽象方法,有抽象方法的类必须是抽象类。
  • 类有的成员:成员变量、方法、构造器、抽象类都可以有。
  • 抽象类最主要的特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
  • 一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.2抽象类的好处

父类知道每个子类都要做某个行为,但每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去重写实现,我们设计这样的抽象类,就是为了更好的支持多态。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.3模版方法设计模式

  • 提供一个方法作为完成某类功能的模版,模版方法封装了每个实现步骤,但允许子类提供特定步骤的实现。
  • 模版方法设计模式可以:提高代码的复用、并且简化子类设计。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.3.1写法
  1. 定义一个抽象类。
  2. 在里面定义两个方法

一个是模版方法:把共同的实现步骤放里面去。

一个是抽象方法:不确定的步骤实现,交给具体的子类来完成。

建议:用final修饰模版方法,因为可以确保模版方法不会被重写,我们的目的是模版方法是被子类直接使用,不能被子类重写,一旦子类重写模版方法,模版就失效了。


5-接口

5.1接口的概述

  • Java提供了一个关键字interface定义成接口。

JDK8之前接口只能在内部写成员变量(常量)和成员方法(抽象方法)

  • 注意:接口不能创建对象。

  • 接口是用来被类实现(implements)的,实现接口的类称为实现类,一个类可以同时实现多个接口。(接口可以理解为干爹)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.2接口的好处

弥补了类单继承的不足,一个类可以同时实现多个接口,使类的角色更多,功能更强大。

让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现(更利于程序的解耦合)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.3接口综合小案例

请设计一个班级学生的信息管理模块:学生的数据有:姓名、性别、成绩
功能1:要求打印出全班学生的信息; 功能2:要求打印出全班学生的平均成绩。
------------------------------------------------------------------------------------------------------------------------
​ 注意!以上功能的业务实现是有多套方案的,比如:
​ 第1套方案:能打印出班级全部学生的信息;能打印班级全部学生的平均分。
​ 第2套方案:能打印出班级全部学生的信息(包含男女人数);能打印班级全部学生的平均分(要求是去掉最高分、最低分)。
​ 要求:系统可以支持灵活的切换这些实现方案。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.4JDK8开始,接口新增的三种方法

  • 1.默认方法(普通实例方法):必须加default修饰
    默认使用public修饰
    如何调用?使用接口的实现类的对象来调用。

  • 2.私有方法(JDK9才开始支持的)
    私有的实例方法(也就是对象方法,但是接口没有实例化对象)。
    那如何调用接口的私有方法?只能使用接口内的实例化对象调。

  • 3.静态方法
    默认使用public修饰
    如何调用?直接使用当前接口名来调用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是实际上,这个新特性在我们实际使用中几乎不会用到,如果硬要说优点。

  • 增强了接口的能力,更便于项目的扩展和维护中。

5.5接口的注意事项

目标:

1、接口与接口可以多继承:一个接口可以同时继承多个接口[重点]。

  • 类与类:单继承 一个类只能继承一个父类。
  • 类与接口:多实现 一个类可以实现多个接口。
  • 接口与接口:多继承 一个接口可以同时继承多个接口。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2、一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承,也不支持多实现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 并且如果方法签名冲突,类也是不可以支持多实现的。

3、一个类继承了父类,又同时实现了接口,如果父类中和接口中有同名的默认方法,实现类会优先用父类的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4、一个类实现了多个接口,如果多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是那个抽象的调用,国内的开发人类基本不会使用,但是是可以行得通的。

5.6接口和抽象类的区别

这个需要有很强的语法功底才能理解明白,因为一千个人有一千个oop的理解。

相同点:

  1. 都是抽象形式,都可以有抽象方法,都不能创建对象。
  2. 都是派生子类形式:抽象类是被子类继承使用,接口是被实现类实现。
  3. 继承抽象类或者实现接口都必须重写所有的抽象方法,否则自己要成为抽象类或者报错。
  4. 都能支持多态,都能够实现解耦合。

不同点:

  1. 抽象类中可以定义类的全部不同成员,接口只能定义常量、抽象方法(JDK新增三种方式)
  2. 抽象类只能被单继承,接口可以被类多实现。
  3. 一个类继承抽象类就不能再继承其他类,一个类实现了接口(还可以继承其他类或者实现其他接口)
  4. 抽象类体现模版思想,更适合做父类实现代码的复用性。(最佳实践:IO流)
  5. 接口更适合做功能的解耦合,解藕合性更强更灵活。(最佳实践:集合)

使用,接口是被实现类实现。
3. 继承抽象类或者实现接口都必须重写所有的抽象方法,否则自己要成为抽象类或者报错。
4. 都能支持多态,都能够实现解耦合。

不同点:

  1. 抽象类中可以定义类的全部不同成员,接口只能定义常量、抽象方法(JDK新增三种方式)
  2. 抽象类只能被单继承,接口可以被类多实现。
  3. 一个类继承抽象类就不能再继承其他类,一个类实现了接口(还可以继承其他类或者实现其他接口)
  4. 抽象类体现模版思想,更适合做父类实现代码的复用性。(最佳实践:IO流)
  5. 接口更适合做功能的解耦合,解藕合性更强更灵活。(最佳实践:集合)

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

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

相关文章

有没有噪音低的宠物空气净化器推荐?希喂、IAM性能PK

有一说一,随着清洁家电市场的不断发展,市面上的各种清洁家电品类也是越来越多,像是吸尘器、洗地机、扫地机等等这些产品估计大家都很熟悉了。 但!如果你家也跟我家一样也是养了几只猫猫狗狗,那你就会发现到&#xff0…

vscode摸鱼学习插件开发

不知道大家在摸鱼的时候,会不会想要学习? 或者有没有考公人,下班要学习的? 上班时间摸鱼,下班时间不够学习? 为此,我决定开发一个vscode插件,来刷粉笔题 粉笔插件名称:…

hive将包含逗号的字段拆分为多列

目录 一、概述 二、行动 1.准备数据 2.数据清洗 3.substring_index函数 4.split函数实现 一、概述 想将hive表中包含逗号的字段按逗号做分隔符进行分列操作 二、行动 1.准备数据 --1 select {1,2,3,4,5,6,7,8} as num_str --使用的数据2.数据清洗 --2 select num_s…

文心一言 VS 讯飞星火 VS chatgpt (381)-- 算法导论24.5 1题

一、给出图24-2的与图中两棵最短路径树不同的另外两棵最短路径树。如果要写代码,请用go语言。 文心一言: 在图论中,最短路径树(Shortest Path Tree, SPT)是一种从单个源点到所有其他节点的最短路径形成的树。给定一个…

故障诊断 | MTF-TLSSA-DarkNet-GRU-MSA迁移学习故障识别程序(t分布+莱维飞行改进麻雀优化)

故障诊断 | 故障诊断实例代码 目录 故障诊断 | 故障诊断实例代码效果一览基本介绍程序设计参考资料 效果一览 基本介绍 利用了迁移学习和多项技术改进,包括麻雀搜索法、DarkNet19、GRU、多头注意力机制等,以提高故障识别的准确性和效率 模型框架&#x…

在Bash脚本中 set -e 是什么意思

问题 我正在研究这个预安装(preinst)脚本的内容,该脚本会在从 Debian 软件包(.deb)文件解压该包之前执行。 脚本包含以下代码: #!/bin/bash set -e # Automatically added by dh_installinit if [ "$1" install ]; thenif [ -d /usr/share…

使用yolov3配置文件训练自己的数据

目录 前言 一、准备数据集 二、创建文件结构 三、格式化文件 1.data文件夹 2.config文件夹 四、修改yolo的配置文件 1.train文件 2.json2yolo文件 3.datasets文件 前言 使用yolov3框架训练自己的数据大致分为这四步: 准备数据集创建文件结构格式化文件 …

【小白学机器学习29】 概率统计与图形 ( hist, bar, pie , box ,scatter ,line)

目录 1 频度/次数 1.1 频度统计表:频度分布表 1.2 频数分布图直方图 histogram / hist 1.3 对比,柱状图 bar graph /column chart 2 饼图 pie chart 2.1饼图特点 3 南丁格尔玫瑰图 4 茎叶图 stem-and-leaf display 5 箱型图 box plot 6 …

springboot098基于web的网上摄影工作室的开发与实现(论文+源码)_kaic

网上摄影工作室 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了网上摄影工作室的开发全过程。通过分析网上摄影工作室管理的不足,创建了一个计算机管理网上摄影工作室的方案。文章介绍了网上摄影工…

【再谈设计模式】单例模式~唯一性的守护者

一、引言 在软件工程中,软件开发,设计模式是提高代码复用性和可维护性的有效工具。单例模式(Singleton Pattern)作为一种创建型设计模式,旨在确保一个类只有一个实例,并提供对该实例的全局访问。这一模式在…

UDP-鼠李糖合成酶基因的克隆与鉴定-文献精读76

何首乌中UDP-鼠李糖合成酶基因FmRHM1/2的克隆与鉴定 摘要 UDP-鼠李糖是一种由UDP-鼠李糖合酶(RHM)催化合成的鼠李糖供体,而鼠李糖是鼠李糖苷化合物的重要组成部分,植物中只有少数基因编码的酶参与UDP-鼠李糖生物合成。本研究基于…

创建多维数组的全部元素的索引np.indices

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 创建多维数组的 全部元素的索引 np.indices [太阳]选择题 根据题目代码,执行的结果是? import numpy as np arr np.arange(6).reshape((2, 3)) print(&quo…

C/C++ 矩阵的QR分解

#include <iostream> #include <vector> using namespace std;int main() /* 矩阵A的QR分解*/ {// 动态分配内存int m 3; // 行数int n 3; // 列数// 初始化矩阵Adouble A[3][3] {{1, 2, 2},{2, 1, 2},{1, 2, 1}};double R[3][3] { 0 };double Q[3][3] { 0 };…

2023-2024年教育教学改革、教学成果奖等项目申请书合集-最新出炉 附下载链接

2023-2024年教育教学改革、教学成果奖等项目申请书合集 下载链接-点它&#x1f449;&#x1f449;&#x1f449;&#xff1a;2023-2024年教育教学改革、教学成果奖等项目申请书合集-最新出炉.zip 资源介绍 本资源展示了2023-2024年高等教育领域的教育教学改革项目以及教学成…

某大型建设集团有限公司信息化技术方案(250页WORD)

方案介绍&#xff1a; 本信息化技术方案旨在构建一个集成度高、功能全面、操作简便的信息化系统&#xff0c;涵盖公司管理、业务运营、项目监控、数据分析等多个方面。通过引入云计算、大数据、物联网、人工智能等先进技术&#xff0c;实现资源的优化配置、流程的高效协同和数…

EDA --软件开发之路

之前一直在一家做数据处理的公司&#xff0c;从事c开发&#xff0c;公司业务稳定&#xff0c;项目有忙有闲&#xff0c;时而看下c&#xff0c;数据库&#xff0c;linux相关书籍&#xff0c;后面跳槽到了家eda公司&#xff0c;开始了一段eda开发之路。 eda 是 electric design …

Failed to install Visual Studio Code update

当关闭vsCode的时候&#xff0c;出现了下面的报错&#xff1a; 可能是之前将vscode文件换了位置导致的&#xff0c;并且vscode在桌面的图标也变成了下面这个&#xff1a; 解决方法&#xff1a; 找到上图路径的log文件并打开&#xff1a; 搜索电脑中的Code.exe文件 并粘贴到上…

神经网络进行波士顿房价预测

前言 前一阵学校有五一数模节校赛&#xff0c;和朋友一起参加做B题&#xff0c;波士顿房价预测&#xff0c;算是第一次自己动手实现一个简单的小网络吧&#xff0c;虽然很简单&#xff0c;但还是想记录一下。 题目介绍 波士顿住房数据由哈里森和鲁宾菲尔德于1978年Harrison …

如果要用示波器测量电路中某处电压与电流的相位差,应如何实现?

使用示波器测量电路中某处电压与电流的相位差&#xff0c;可以通过以下步骤实现&#xff1a; 1. 准备和连接 所需设备 示波器&#xff08;双通道&#xff09;电流探头&#xff08;或电阻分压器用于间接测量电流&#xff09;电压探头 连接探头到待测信号 电压探头&#xff…

恋爱脑学Rust之闭包三Traits:Fn,FnOnce,FnMut

在Rust中&#xff0c;FnOnce、FnMut和Fn是三个用于表示闭包&#xff08;closure&#xff09;类型的trait。闭包是一种特殊的函数&#xff0c;它可以捕获其环境变量&#xff0c;即在其定义时所处的作用域中的变量。以下是关于这三个trait的详细介绍&#xff1a; 1. FnOnce&#…