Java中的抽象类和接口

news2025/1/20 16:31:40

java中的抽象类和接口

  • 抽象类
    • 什么是抽象类?
    • 抽象的使用场景
    • 抽象类的案例
    • 抽象类的特征、注意事项小结
    • 抽象类的应用知识:模版方法模式
  • 接口
    • 接口概述、特点
    • 接口的基本使用:被实现
    • 接口与接口的关系:多继承
    • JDK8开始接口新增方法
    • 接口的注意事项

抽象类

什么是抽象类?

1.在Java中abstract是抽象的意思,可以修饰类、成员方法。
2.abstract修饰类,这个类就是抽象类,修饰方法,这个方法就是抽象方法。

修饰符 abstract class 类名{
	修饰符 abstract 返回值类型 方法名称(形参列表);
}

// 抽象类
public abstract class Animal {
    // 抽象方法
    public abstract void run();
}

注意事项:
1.抽象方法只有方法签名,不能声明方法体。
2.一个类中如果定义了抽象方法,这个类必须声明成抽象类,否则报错。

抽象的使用场景

1.抽象类可以理解成不完整的设计图,一般作为父类,让子类来继承。
2.当父类知道子类一定要完成某些行为,但是每个子类该行为的实现又不相同,于是该父类就把该行为定义成抽象方法的形式,具体实现交给子类去完成,此时这个类就可以声明成抽象类。

在这里插入图片描述

抽象类的案例

系统需求:
1.某加油站推出了两种支付卡,一种是预存10000的金卡,后续加油享受8折优惠,另一种是预存5000的银卡,后续加油享受8.5折优惠。
2.请分别实现2种卡片进入收银系统后的逻辑,卡片需要包含主人名称,余额,支付功能。
分析实现:
1.创建一张卡片父类:定义属性包括主人名称、余额、支付功能(具体实现交给子类)。
2.创建一张白卡类:重写支付功能,按照原价的8折计算输出。
3.创建一张银卡类:重写支付功能,按照原价的8.5折计算输出。

代码实现:
在这里插入图片描述
模拟消费结果:
在这里插入图片描述

抽象类的特征、注意事项小结

1.类有的成员(成员变量,方法、构造器)抽象类都具备。
2,抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
3.一个类继承了抽象类必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
4.不能用abstract修饰变量,代码块,构造器。
5.最重要的特征:得到了抽象方法,失去了创建对象的能力(为什么不能创建对象?假如可以创建对象,用对象调用抽象的方法的时候,方法是不完整的所以不能创建对象。即使抽象类中没有抽象方法也不能创建对象。)

面试题:fina和abstract是什么关系?
1.互斥关系
2.abstract定义的抽象类作为模版让子类继承,final定义的类不能被继承。
3.抽象方法定义通用功能让子类重写,final定义的方法子类不能重写。

抽象类的应用知识:模版方法模式

使用场景说明:当系统中出现同一个功能多处在开发,而该功能中大部分是一样的,只有其中部分可能不同的时候。
在这里插入图片描述
模版方法模式实现步骤
1.把功能定义成一个所谓的模版方法,放在抽象类中,模版方法中只定义通用且能确定的代码。
2.模版方法中不能决定的功能定义成抽象方法让具体子类去实现。

案例:写作文案例
需求:
1.现在有两个学生,一类是中学生,一类是小学生,他们都写《我的爸爸》这篇作文。
2.要求每种类型的学生,标题第一段和最后一段,内容必须一样,正文部分自己发挥。
3.请选择最优的面向对象方案进行设计。
分析:

在这里插入图片描述
代码:
在这里插入图片描述
模版方法建议使用final修饰的,这样会更专业,那么为什么呢?
答:模版方法是给子类直接使用的,不是让子类重写的,一旦子类从写了模版方法,则模版方法就失效了,因此,加上final后可以防止子类重写了模版方法,这样更安全,专业。

接口

接口概述、特点

1.接口的格式如下:

// 接口用关键子interface来定义
public interface 接口名{
	// 常量
	// 抽象方法
}

package com.snowdream.d10_interface;
// 声明接口,体现一种规范公开
public interface interfaceDemo {
    // jdk8之前接口中只能有抽象方法和常量
    // 常量 public static final可以省略不写
    String SHCOOL_NAME = "snow";
    // 抽象方法
    public abstract void run();
    // 由于接口需要公开,public abstract可以省略不写
    void eat();
}

2.JDK8之前接口中只能是抽象方法和常量,没有其他成分了。
什么是接口:接口是一种规范。

接口的基本使用:被实现

1.接口是用来被类实现(implements)的,实现接口的类称为实现类,实现类可以理解成所谓的子类。

修饰符 class 实现类 implements 接口1,接口2,借口3,...()

在这里插入图片描述
2.从上面可以看出,接口可以被类单实现,也可以被类多实现。
在这里插入图片描述
接口实现的注意事项:
一个类实现接口,必须重写完全部接口的全部抽象方法,否则这个类需要定义成抽象类。

接口与接口的关系:多继承

总结:
1.类和类的关系:单继承。
2.类和接口的关系:多实现。
3.接口和接口的关系:多继承,一个接口可以同时继承多个接口。

在这里插入图片描述
接口多继承的作用
规范合并,整合多个接口为同一个接口,便于子类实现。

JDK8开始接口新增方法

1.JDK8版本开始后,Java只对接口的成员方法进行了新增
原因:

在这里插入图片描述
项目Version2.0需要对Inter接口丰富,加入10个新的抽象方法,此时改了接口就要所有实现类实现这些方法。
在这里插入图片描述
第一种:默认方法
1.类似之前写的普通实例方法:必须用default修饰
2.默认会public修饰,需要用接口的实现类对象来调用

default void run(){
	System.out.println("~~开始跑~~");
}

第二种:静态方法
1.默认会public修饰,必须static修饰。
2.注意:接口的静态方法必须用本身的接口名来调用。

static void inAddr(){
	System.out.println("java");
}

第三种:私有方法
1.就是私有的实例方法:必须使用private修饰,从JDK1.9才开始有的。
2.只能在本类中被其他的默认方法或者私有方法访问。

private void go(){
	System.out,print("~~准备~~");
}

代码实现:

package com.snowdream.interface_jdk8;

public interface SportManInter {
    // 1.jdk8开始,默认方法(实例方法) public 可以省略不写
    // 默认方法,接口不能创建对象,只能给实现类,由实现类的对象调用。
    default void run(){
        System.out.println("跑的");
        // 内部调用
        go();
    }
    // 2.静态方法,必须使用static修饰,默认用public修饰
    // 使用接口自己调用
    static void inAddr(){
        System.out.println("学习Java语法。");
    }
    // 私有方法(实例方法),jdk9开始支持,必须在接口内部才能访问
    private void go(){
        System.out.println("走的");
    }
}
class PingPangMan implements SportManInter{

}
class Test{
    public static void main(String []args){
        PingPangMan p = new PingPangMan();
        p.run();
        // 只有接口调用
        SportManInter.inAddr();
    }
}

接口的注意事项

1.接口不能创建对象
2.一个类实现多个接口,多个接口中有同样的静态方法不冲突。
3.一个类继承了父类,同时又实现了接口,父类中和接口中有同名方法,默认用父类的。
4.一个类实现了多个接口,多个接口中存在同名的默认方法,不冲突,这个类重写该方法即可。
5.一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承。

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

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

相关文章

AtCoder Beginner Contest 277 F. Sorting a Matrix(拓扑排序+虚点)

题目 n*m(2<n,m<1e6,n*m<1e6)的矩阵&#xff0c; 第i行第j列元素a[i][j](0<a[i][j]<n*m) 对于值为0的元素&#xff0c;你可以将其赋值为任意正整数&#xff0c; 不同位置的0元素&#xff0c;可以被赋值成不同的正整数 然后&#xff0c;你可以执行以下操作若…

firefly3399 移植linux5.15.80 - 2022-11-27

需要注意的是&#xff0c;虚拟机需要足够的硬盘空间&#xff0c;不小于15GB&#xff01;&#xff01; 一、内核源码下载 国内镜像地址 git clone https://kernel.source.codeaurora.cn/pub/scm/linux/kernel/git/stable/linux.git/ 基本达到了带宽的最大值。 国外地址&#…

Android使用AudioTrack播放WAV音频文件

目录 1、wav文件格式 2、wav文件解析 3、wav文件播放 QA&#xff1a; 开始播放wav的时候使用了系统的播放器mediaplayer进行播放&#xff0c;但是无奈mediaplayer支持的实在不好。 好些年前自己做过pcm播放使用的是audiotrack&#xff0c;参考&#xff1a;CSDN 其实两者之…

php 进程池设计与实现,phper必学!

php 进程池设计与实现phper 为什么要学习进程池池的概念为什么要有进程池?动态创建进程缺点进程池的优点选择子进程为新任务服务的方式进程池模型服务端客户端结语phper 为什么要学习进程池 在php开发过程中经常使用的 php-fpm 使用的进程模型就是进程池&#xff0c;学习进程…

如何基于FSM有限状态机实现Enemies AI

文章目录&#x1f35f; Preface&#x1f355; 巡逻状态&#x1f37f; 寻路状态&#x1f32d; 攻击状态&#x1f357; 完整代码&#x1f35f; Preface 本文简单介绍如何基于FSM有限状态机实现Enemies AI&#xff0c;首先定义敌人的AI逻辑&#xff1a;默认状态下Enemy为巡逻状态…

刷爆力扣之等价多米诺骨牌对的数量

刷爆力扣之等价多米诺骨牌对的数量 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&…

使用 nlohmann 解析 json 文件

使用 nlohmann 解析 json 文件nlohmann/json的配置json基本数据结构json文件的读取、构造与输出C对象与nlohmann::json对象的转换C对象转换成nlohmann::json对象nlohmann::json对象转换成C对象序列化反序列化序列化nlohmann 是德国工程师&#xff0c;以其名字为工程名的 nlohm…

springboot项目的打包发布部署,jar和war的区别

简介&#xff1a; 1.Spring Boot使用了内嵌容器&#xff0c;因此它的部署方式也变得非常简单灵活&#xff0c;可以将Spring Boot项目打包成JAR包来独立运行&#xff0c;也可以打包成WAR包部署到Tomcat容器中运行&#xff0c;如果涉及大规模的部署&#xff0c;Jenkins成为最佳选…

【HCIP-Datacom】 IS-IS基础 ISIS动态路由协议配置(ISIS思维导图在底部)

目录 ISIS配置方法&#xff1a; 路由计算&#xff1a; ATT置位条件&#xff1a; 路由渗透&#xff1a; ISIS的认证&#xff1a; ISIS配置命令&#xff1a; ISIS的开销类型&#xff1a; ISIS配置方法&#xff1a; 进入ISIS进程 isis 1 //创建isis进程 设置实体名 network-entit…

.NET 升级发布后,IIS出现了System.IO.DirectoryNotFoundException

最近计划升级项目到.NET6, 在使用Release发布后发现IIS不能发现wwwroot目录,什么错误? 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:无尽的折腾后,终于又回到了起点,工控,我来了 !1 发布的一…

《统计学习方法》 第十六章 主成分分析PCA

主成分分析(PCA) 假设xxx为mmm 维随机变量&#xff0c;其均值为μ\muμ&#xff0c;协方差矩阵为Σ\SigmaΣ 考虑由mmm维随机变量xxx到mmm维随机变量yyy的线性变换 yiαiTx∑k1mαkixk,i1,2,⋯,my _ { i } \alpha _ { i } ^ { T } x \sum _ { k 1 } ^ { m } \alpha _ { k …

计算点在线上的投影坐标

如题 计算点到线上的垂点&#xff0c;首先明确&#xff1a; 该线段必须给出确切的起始点和终点&#xff0c; 而不是一个向量&#xff0c;因为一个向量并不能代表一个线段。 所以参数列表如下&#xff1a; Vector3 VerticalPoint(Vector3 point, Vector3 lStart, Vector3 lEnd…

【论文翻译】增强复制状态机的两阶段提交协议

Enhancing Two Phase-Commit Protocol for Replicated State Machines Halit Uyanık and Tolga Ovatman Department of Computer Engineering Istanbul Technical University 34469 Istanbul, Turkey Email目录1 介绍2 设计和实现2.1 事件类型2.2 在状态机上执行事件2.3 具有优…

8、常用基本命令(重要)

文章目录8、常用基本命令&#xff08;重要&#xff09;8.1 帮助命令8.1.1 man 获得帮助信息8.1.2 help 获得 shell 内置命令的帮助信息8.1.3 常用快捷键8.2 文件目录类8.2.1 pwd 显示当前工作目录的绝对路径8.2.2 ls 列出目录的内容8.2.3 cd 切换目录8.2.4 mkdir 创建一个新的目…

Linux驱动入门

一、驱动简介 Linux的驱动在本质上就是一种软件程序&#xff0c;上层软件可以在不了解硬件特性的情况下&#xff0c;通过驱动提供的接口&#xff0c;和计算机硬件进行通信。 系统调用是内核和应用程序之间的接口&#xff0c;而驱动程序是内核和硬件之间的接口。它为应用程序屏蔽…

缓存穿透、缓存击穿、缓存雪崩及其解决方案

缓存&#xff08;cache&#xff09;&#xff0c;大家都非常熟悉&#xff0c;几乎每个系统乃至整个计算机体系中都会用到。在分布式系统架构中&#xff0c;主要用于减轻数据库的压力&#xff0c;提高系统的响应速度和并发吞吐&#xff0c;即空间(内存)换时间。当大量的读、写请求…

【模型推理加速系列】06: 基于resnet18加速方案评测

简介 花雪随风不厌看&#xff0c;更多还肯失林峦。愁人正在书窗下&#xff0c;一片飞来一片寒。小伙伴们好&#xff0c;我是微信公众号小窗幽记机器学习的首席称重师&#xff1a;卖麻辣烫的小男孩。今天这篇文章以resnet18模型为例&#xff0c;对比Pytorch、ONNX、TorchScript…

cmdline(二):uboot cmdline怎么传?cmdline kernel怎么用?

前面我们知道了cmdline是什么&#xff0c;已经在哪里添加cmdline&#xff1f;现在我们来看看在哪里传输cmdline&#xff0c;以及传输收到后怎么用&#xff1f; 参考内容来自前辈&#xff0c;感激&#xff1a; https://blog.csdn.net/weixin_42031299/article/details/12123950…

Spring Boot JPA EntityManager实体管理器示例

在本教程中&#xff0c;您将了解如何在 Spring Boot 示例中使用 JPA EntityManager&#xff08;使用 CRUD 操作和查询方法&#xff09;。我将向您展示&#xff1a; 在 Spring 引导中访问 JPA 实体管理器的方法如何使用实体管理器方法&#xff1a;执行SQL查询使用和CRUD操作cre…

【Android App】实现在线语音合成功能(使用云知声平台和WebSocket 超详细 附源码)

需要源码和Jar包请点赞关注收藏后评论区留下QQ~~~ 一、在线语音合成 虽然国产智能机大多集成了中文语音引擎&#xff0c;但是系统自带的语音工具无法满足商用要求&#xff0c;功能单一&#xff0c;所以势必引入第三方的语音引擎&#xff0c;依靠第三方提供的开发包统一支撑语音…