JavaSE——抽象类和接口
目录
一 .抽象类
1.抽象类概念
2.抽象类语法
3.抽象类特性
4.抽象类的作用
二. 接口
1.接口的概念
2.语法规则
3.接口的使用
4.接口特性
5.实现多个接口
6.接口间的继承
三.抽象类和接口的区别
一 .抽象类
1.抽象类概念
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类;抽象类中不一定有抽象方法,而抽象方法一定在抽象类中。
2.抽象类语法
在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。
public abstract class Shape {abstract public void draw();
abstract void calcArea();
public double getArea(){
return area;}
protected double area;
}
注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法。
3.抽象类特性
1. 抽象类不能直接实例化对象;
2. 抽象方法不能是 private修饰的;
3. 抽象方法不能被final和static修饰,因为抽象方法要被子类重写;4. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰;
5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类;
6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量;
例:

上述程序中抛出的异常都是一些常见的错误,请大家务必要重视!!
public abstract class Shape {public String name;public void eat() {//...}public abstract void draw();
}
abstract class A extends Shape {abstract void test();
}
class C extends A {@Overridevoid test() {//...}@Overridepublic void draw() {//...}
}
上述代码中我们可以看出抽象类必须被继承,并且继承后子类要重写父类中的抽象方法。
4.抽象类的作用
抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类。 然后让子类重写抽象类中的抽象方法;这里大家肯定会有疑惑,普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢?确实如此,但是使用抽象类相当于多了一重编译器的校验。使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成。那么此时如果不小心误用成父类
了, 使用普通类编译器是不会报错的;但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题。
二. 接口
1.接口的概念
在现实生活中,接口的例子比比皆是,最常见的就是属笔记本电脑上的USB口,电源插座等。电脑的USB口上,可以插:U盘、鼠标、键盘...所有符合USB协议的设备。
通过上述例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
2.语法规则
接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字就定义了一个接口.
public interface 接口名称{
// 抽象方法
public abstract void method1(); // public abstract 是固定搭配,可以不写
public void method2();
abstract void method3();}
提示:
1. 创建接口时, 接口的命名一般以大写字母 I 开头。
2. 接口的命名一般使用 "形容词" 词性的单词。
3. 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号,保持代码的简洁性。
3.接口的使用
接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。
public class 类名称 implements 接口名称{// ...
}
注意:子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系。
下面以笔记本电脑使用USB鼠标、USB键盘的例子给大家示例一下:
public interface USB {void openDevice();void closeDevice();
}
public class Mouse implements USB {@Overridepublic void openDevice() {System.out.println("打开鼠标");}@Overridepublic void closeDevice() {System.out.println("关闭鼠标");}public void click(){System.out.println("点击鼠标");}
}
public class KeyBoard implements USB {@Overridepublic void openDevice() {System.out.println("打开键盘");}@Overridepublic void closeDevice() {System.out.println("关闭键盘");}public void inPut(){System.out.println("键盘输入");}
}
public class Computer {public void powerOn(){System.out.println("打开笔记本电脑");}public void powerOff(){System.out.println("关闭笔记本电脑");}public void useDevice(USB usb){usb.openDevice();if(usb instanceof Mouse){Mouse mouse = (Mouse)usb;mouse.click();}else if(usb instanceof KeyBoard){KeyBoard keyBoard = (KeyBoard)usb;keyBoard.inPut();}usb.closeDevice();}
}
public class Test {public static void main(String[] args) {Computer computer = new Computer();computer.powerOn();computer.useDevice(new Mouse());// 使用鼠标设备computer.useDevice(new KeyBoard()); // 使用键盘设备computer.powerOff();}
}
这里我们首先是创建了一个USB接口,然后再分别创建笔记本类,鼠标类,键盘类以及测试类。
4.接口特性
1. 接口类型是一种引用类型,但是不能直接new接口的对象

2. 接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是public abstract,其他修饰符都会报错)
3. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现,但是如果接口中的方法被default或者static修饰,那么可以有具体的实现。


4. 重写接口中方法时,不能使用默认的访问权限。
5. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量。

6. 接口中不能有静态代码块和构造方法。
7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class,一个接口对应一个字节码文件。
8. 如果一个类没有实现接口中的所有的抽象方法,则类必须设置为抽象类,如果这个抽象类被继承
那么就得实现所有的没被实现的方法。
5.实现多个接口
在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接口。下面通过类来表示一组动物。
public abstract class Animal {public String name;public int age;public Animal(String name, int age) {this.name = name;this.age = age;}public abstract void eat();
}
public interface IFly {void fly();
}
public interface IRunning {void run();
}
public interface ISwimming {void swim();
}
public class Fish extends Animal implements ISwimming{public Fish(String name, int age) {super(name, age);}@Overridepublic void swim() {System.out.println(this.name+"正在游泳...");}@Overridepublic void eat() {System.out.println(this.name+"正在吃鱼粮");}
}
public class Frog extends Animal implements ISwimming,IRunning{public Frog(String name, int age) {super(name, age);}@Overridepublic void run() {System.out.println(this.name + "正在往前跳...");}@Overridepublic void swim() {System.out.println(this.name + "正在游泳...");}@Overridepublic void eat() {System.out.println(this.name + "正在吃昆虫...");}
}
public class Duck extends Animal implements ISwimming,IRunning,IFly{public Duck(String name, int age) {super(name, age);}@Overridepublic void fly() {System.out.println(this.name + "正在飞翔...");}@Overridepublic void run() {System.out.println(this.name + "正在跑...");}@Overridepublic void swim() {System.out.println(this.name + "正在游泳...");}@Overridepublic void eat() {System.out.println(this.name + "正在吃谷物...");}
}
上面的代码展示了 Java 面向对象编程中最常见的用法: 一个类继承一个父类, 同时实现多种接口;继承表达的含义是 is - a 语义, 而接口表达的含义是具有 xxx 特性。
这样设计有什么好处呢? 时刻牢记多态的好处, 让程序猿忘记类型;有了接口之后, 类的使用者就不必关注具体类型,而只关注某个类是否具备某种能力。
6.接口间的继承
在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的;接口间的继承相当于把多个接口合并在一起。
接口可以继承一个接口,达到复用的效果,使用 extends 关键字。
interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
interface IAmphibious extends IRunning, ISwimming {//...
}
这里通过接口继承创建了一个新的接口 IAmphibious。
三.抽象类和接口的区别
抽象类和接口都是 Java 中多态的常见使用方式,都需要重点掌握同时又要认清两者的区别。
核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法。
正如之前写的 Animal 例子,此处的 Animal 中包含一个 name 这样的属性, 这个属性在任何子类中都是存在的;因此此处的 Animal 只能作为一个抽象类, 而不应该成为一个接口。
再次提醒一下,抽象类存在的意义就是为了让编译器更好的校验。
相关文章:
JavaSE——抽象类和接口
目录 一 .抽象类 1.抽象类概念 2.抽象类语法 3.抽象类特性 4.抽象类的作用 二. 接口 1.接口的概念 2.语法规则 3.接口的使用 4.接口特性 5.实现多个接口 6.接口间的继承 三.抽象类和接口的区别 一 .抽象类 1.抽象类概念 在面向对象的概念中,所有的对…...
生成式人工智能 - stable diffusion web-ui安装教程
一、Stable Diffusion WEB UI 屌丝劲发作了,所以本地调试了Stable Diffusion之后,就去看了一下Stable Diffusion WEB UI,网络上各种打包套件什么的好像很火。国内的也就这个层次了,老外搞创新,国内跟着屁股后面搞搞应用层,就叫大神了。 不扯闲篇了,我们这里从git源码直接…...
11-Linux文件系统与日志分析
11.1深入理解Linux文件系统 在处理Liunx系统出现故障时,故障的症状是最易发现。数学LInux系统中常见的日志文件,可以帮助管理员快速定位故障点,并及时解决各种系统问题。 11.1.1 inode与block详解 文件系统通常会将这两部分内容分别存放在…...
mac M1下安装PySide2
在M1下装不了PySide2, 是因为PySide2没有arm架构的包 1 先在M1上装qt5 安装qt主要是为了能用里面的Desinger, uic, rcc brew install qt5 我装完的路径在/opt/homebrew/opt/qt5 其中Designer就是用来设计界面的 rcc用resource compiler, 编绎rc资源文件的, 生成对应的py文件…...
超详解——识别None——小白篇
目录 1. 内建类型的布尔值 2. 对象身份的比较 3. 对象类型比较 4. 类型工厂函数 5. Python不支持的类型 总结: 1. 内建类型的布尔值 在Python中,布尔值的计算遵循如下规则: None、False、空序列(如空列表 [],空…...
C++的MQTT开发:使用Paho的C++接口实现消息发布、订阅、连接RabbitMQ
C Paho实现MQTT消息发布功能 要使用paho的cpp接口实现发布MQTT消息的功能,需要进行以下步骤: 安装paho库:首先从paho官方网站下载并安装paho的C库。可以从https://www.eclipse.org/paho/clients/cpp/ 下载适合操作系统的版本。 创建MQTT客户…...
深度网络学习笔记(二)——Transformer架构详解(包括多头自注意力机制)
Transformer架构详解 前言Transformer的整体架构多头注意力机制(Multi-Head Attention)具体步骤1. 步骤12. 步骤23. 步骤34. 步骤4 Self-Attention应用与比较Self-Attention用于图像处理Self-Attention vs. CNNSelf-Attention vs. RNN Transformer架构详…...
Python 快速查找并替换Excel中的数据
Excel中的查找替换是一个非常实用的功能,能够帮助用户快速完成大量数据的整理和处理工作,避免手动逐一修改数据的麻烦,提高工作效率。要使用Python实现这一功能, 我们可以借助Spire.XLS for Python 库,具体操作如下&am…...
KafkaStream Local Store和Global Store区别和用法
前言 使用kafkaStream进行流式计算时,如果需要对数据进行状态处理,那么常用的会遇到kafkaStream的store,而store也有Local Store以及Global Store,当然也可以使用其他方案的来进行状态保存,文本主要理清楚kafkaStream…...
PowerDesigner导入Excel模板生成数据表
PowerDesigner导入Excel模板生成数据表 1.准备好需要导入的Excel表结构数据,模板内容如下图所示 2.打开PowerDesigner,新建一个physical data model文件,填入文件名称,选择数据库类型 3.点击Tools|Execute Commands|Edit/Run Script菜单或按下快捷键Ctrl Shift X打开脚本窗口…...
STM32 HAL库开发——入门篇(3):OLED、LCD
源自正点原子视频教程: 【正点原子】手把手教你学STM32 HAL库开发全集【真人出镜】STM32入门教学视频教程 单片机 嵌入式_哔哩哔哩_bilibili 一、OLED 二、内存保护(MPU)实验 2.1 内存保护单元 三、LCD 3.1 显示屏分类 3.2 LCD简介 3.3 LCD…...
在Linux中查找文件命令的几种方法
要在Linux中查找文件,可以使用以下几种不同的实现方法: 1. 使用find命令: find <搜索路径> <搜索选项> <搜索条件><搜索路径>:表示要搜索的起始路径,可以是一个具体的目录路径,也…...
【TB作品】MSP430F5529 单片机,温度控制系统,DS18B20,使用MSP430实现的智能温度控制系统
作品功能 这个智能温度控制系统基于MSP430单片机设计,能够实时监测环境温度并根据预设的温度报警值自动调节风扇和加热片的工作状态。主要功能包括: 实时显示当前温度。通过OLED屏幕显示温度报警值。通过按键设置温度报警值。实际温度超过报警值时&…...
立创小tips
立创小tips 原理图中 1-修改图纸属性 保存完,绘制原理图的界面就出现了,然后我们鼠标点击原理图的边缘变成红色就可以高边表格的属性了。 2-鼠标右键可以移动整个原理图 3-查看封装 点击任意一个元器件,在右侧就会显示封装属性ÿ…...
Html/HTML5常用标签的学习
课程目标 项目实战,肯定就需要静态网页。朝着做项目方式去学习静态网页。 01、编写第一个html工程结构化 cssjsimages/imgindex.html 归档存储和结构清晰就可以。 02、HTML标签分类 认知:标签为什么要分类,原因因为:分门别类…...
Tomcat 配置:一文掌握所有要点
引言 Apache Tomcat 是一个流行的开源 Java Servlet 容器和 Web 服务器,广泛用于开发和部署 Java Web 应用程序。正确配置 Tomcat 是确保其性能、安全性和稳定性的关键。本文将详细介绍 Tomcat 的各项配置,帮助您优化和管理 Tomcat 服务器。 一、Tomca…...
git 大文件上传失败 Please remove the file from history and try again.
根据提示执行命令 --- 查找到当前文件 git rev-list --objects --all | grep b24e74b34e7d482e2bc687e017c8ab28cd1d24b6git filter-branch --tree-filter rm -f 文件名 --tag-name-filter cat -- --all git push origin --tags --force git push origin --all --force...
骑砍2霸主MOD开发(14)-进击的巨人
一.巨人 sbyte boneIndex Skeleton.GetBoneIndexFromName(Mission.MainAgent.AgentVisuals.GetSkeleton().GetName(), "r_hand"); cp Mission.MainAgent.AgentVisuals.AddPrefabToAgentVisualBoneByRealBoneIndex("p_sword_a", boneIndex); float agent…...
Android 可拖拽的View,限制在父布局中随意拖拽;拖拽结束后可左右吸边;
实现方法一:自定义View 可随意拖动拖拽的View,限制拖动范围是父布局中; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.ViewGroup; …...
逐步更新动画混合参数(Blend)使其平滑地过渡到目标值
1.具体实现 逐步更新一个动画混合参数(Blend),使其平滑地过渡到目标值,可以实现角色动作的平滑过渡,比如从走路过渡到跑步。 private float currentBleng;private float targetBlend;public float accelerSpeed 5;//…...
Python/Numpy线性代数编程:DeepLearningBook-Notes代码实现完整手册
Python/Numpy线性代数编程:DeepLearningBook-Notes代码实现完整手册 【免费下载链接】deepLearningBook-Notes Notes on the Deep Learning book from Ian Goodfellow, Yoshua Bengio and Aaron Courville (2016) 项目地址: https://gitcode.com/gh_mirrors/de/de…...
离谱!上海交大一学生私吞 5000 奖金,还用豆包 P 假收据骗队友。网友:学历虽高但人品太低
①5 月 18 日,上海交大一则学生违纪通报冲上热搜,实锤了前几天网上曝光的一名学生侵占团队竞赛奖金、造假欺骗队友的恶劣行为。②在 2025 下半年,樊同学(上交大智慧能源学院女生)与 K 同学(电院男生&#x…...
【致91岁的双胞胎】堡垒复习:3步搭建理科“作战地图”,告别零散刷题效率翻倍
很多学生长期陷入理科复习瓶颈:花费大量时间刷题、背书,成绩却始终原地踏步。核心根源只有一个:照搬文科的复习方式学理科。 文科复习侧重知识点记忆、框架梳理、素材积累,通用的A4纸整理法完全适用;但理科的核心是逻辑闭环、体系串联、题型落地、抗遗忘复盘,死记硬背、…...
加速3DGS生成与数字孪生开发:不可错过的8款效率工具盘点
一、行业核心技术科普:3DGS数字孪生开发的工具链概览一个高效的3DGS数字孪生开发流程,离不开一套完整的工具链。从数据采集、模型生成、格式优化到应用开发与部署,每个环节都有其专用的工具。其域创新围绕“感知—重建—理解—创造”的技术路…...
Hermes Agent框架对接Taotoken自定义供应商的配置指南
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Hermes Agent框架对接Taotoken自定义供应商的配置指南 对于使用Hermes Agent框架的开发者而言,能够灵活接入不同的模型…...
ESP8266-12F引脚功能详解与避坑指南:GPIO、ADC、Deep Sleep唤醒怎么用才不烧芯片?
ESP8266-12F引脚工程实战:从硬件陷阱到稳定运行的深度解析 引子:当GPIO突然失灵时 凌晨三点的实验室里,咖啡杯旁散落着七八片ESP8266-12F的残骸——这是我上周连续烧毁的第五块模组。每块价值二十元的开发板在接通电源的瞬间,GPIO…...
小学期第一周作业
...
【软考高级架构】案例题考前突击——分布式一致性在互联网金融平台的应用
案例分析题:分布式一致性在互联网金融平台的应用 案例背景 某互联网金融平台为了满足高并发、高可用的业务需求,采用了基于微服务和分布式架构的系统设计。平台核心业务包括账户余额管理、交易流水记录、资金划转等关键模块。 为提升系统性能,架构师引入了如下关键设计:…...
causal-learn实战指南:从算法选择到因果图解读
1. 为什么你需要causal-learn? 第一次接触因果发现这个概念时,我正被一个电商用户行为分析项目搞得焦头烂额。传统机器学习模型能准确预测用户是否会购买商品,但产品经理总追着我问:"到底哪些因素真正导致了购买行为…...
独立开发者如何借助Taotoken透明计费精细控制多个副业项目成本
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何借助Taotoken透明计费精细控制多个副业项目成本 对于独立开发者或小型工作室而言,同时维护多个AI驱动的…...
