【Java基础】抽象类和接口的使用
个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【JavaSE_primary】
本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区讨论💌
目录
- 一、抽象类
- 抽象类概念
- 抽象类语法
- 抽象类作用
- 二、接口
- 接口语法
- 多接口
- 接口间的继承
- 三、抽象类和接口的区别
一、抽象类
抽象类概念
抽象类:我们通过前面面向对象的学习已经了解到:所有的对象都是通过类来描述的,但是如果反过来,并不是所有的类都是用来描述对象的。如果一个类中没有足够的信息来描述一个完整的对象,那么这个类我们称它为抽象类。
抽象类语法
抽象类语法:
- 抽象类使用abstract修饰
- 抽象类包含普通类所能包含的成员
- 抽象类之所以和普通类有所区别是因为抽象类中包含抽象方法
- 抽象方法同样使用abstract进行修饰
- 抽象类无法进行实例化
- 抽象类存在的最大意义就是为了被继承
- 如果一个普通类继承了抽象类,那么这个普通类必须对抽象类中的抽象方法进行重写
- 如果抽象类A继承了抽象类B,则抽象类A不需要重写抽象类B中的抽象方法,但是如果抽象类A被普通类C继承,那么普通类C需要重写抽象类B的抽象方法
- 抽象方法是不能私有的
- 抽象方法没有加访问限定符时,默认是被public修饰的
- 抽象方法无法被final和static修饰,因为抽象方法是要被重写的
- 抽象类必须被继承,且子类必须重写抽象类的抽象方法,否则,这个子类必须也是一个抽象类。
- 抽象类不一定要包含抽象方法,但是有抽象方法的类一定是抽象类
- 抽象类中可以有构造方法,以便子类创建对象时可以初始化父类的成员变量(不要忘记抽象类是无法实例化的,之所以抽象类可以存在构造方法就是为了子类可以调用抽象类的构造方法来完成抽象类成员变量的初始化操作)
这里解释下为什么抽象方法无法被static修饰:当一个方法被声明为抽象方法时,它要求子类必须提供具体的实现。而静态方法是属于类的一部分,不涉及对象的实例化和继承,因此不能被重写。如果抽象方法允许被static修饰,那么就会导致无法在子类中重写或实现这个方法。
为什么抽象方法无法被final修饰:final修饰的方法无法被子类重写,而抽象方法又要求子类必须对齐(抽象方法)进行重写,二者相互冲突,所以抽象方法当然无法被final修饰了。
我们举一个简单的抽象类,请看:
abstract class Shape {private String color;public Shape(String color) {this.color = color;}// 抽象方法,需要子类实现public abstract double getArea();// 普通方法public String getColor() {return color;}
}
抽象类作用
我们已经知道抽象类是无法进行实例化的,如果想要使用抽象类必须在子类中重写抽象类的抽象方法才可以使用。
但是普通类中的方法也可以被重写啊,那为什么还要整个抽象类那么麻烦呢?原因是因为抽象类在在编译器角度来说相当于多了一重检查。
举个例子,如果我们写了一个普通类A,同时子类B继承了这个普通类A,那么无论我们在子类中是否重写普通类A中的成员方法编译器都不会进行报错的。相反如果是抽象类的话,如果我们没有在子类中实现抽象类的抽象方法的话编译器是会报错的。
所以,充分利用编译器的校检能力对于实际开发中是十分有必要的,可以让我们更早的检查到我们犯下的错误。
二、接口
在Java中,接口是一种抽象类型,它定义了一组方法的规范,但没有提供这些方法的具体实现。接口可以看作是一种约定,它规定了实现该接口的类必须实现接口中声明的所有方法。
我们先来简单实现一个接口再回来讲解接口的语法,请看:
interface Myinterface{public static final int value = 10;// method1和method2均为抽象方法,实现这个接口的类需要提供具体的方法来实现// 接口中的方法均为抽象方法void method1();void method2(String str);// 如果非要在接口中具体实现一个方法的话需要用default来修饰此方法default public void func1(){System.out.println("default public void func1()");}// 接口中也可以存在静态方法public static void func2(){System.out.println("public static void func2");}
}class Myclass implements Myinterface{public void method1(){System.out.println("method1方法必须进行重写");}public void method2(String str){System.out.println("method2方法必须进行重写");}public void fun1(){System.out.println("此方法的重写可以进行选择,既可以重写也可以不重写");}
}
接口语法
接口语法如下:
- 使用
interface来修饰接口 - 接口中的方法不能有具体的实现(即接口中的方法必须为抽象方法),接口中的方法默认是
public abstract修饰;从JDK1.8开始允许有可以有具体实现的方法,但是此方法必须由default修饰;接口中可以存在静态方法 - 接口中的成员变量默认由
public static final修饰 - 接口无法实例化
- 类和接口之间使用
implements来实现多个接口。 - 我们可以选择性的重写接口中由default修饰的方法。
下面来举一个例子以便大家理解:
interface Animal{void whichAnimal();
}
class Cat implements Animal{@Overridepublic void whichAnimal() {System.out.println("我是一只猫咪");}
}
class Dog implements Animal{@Overridepublic void whichAnimal() {System.out.println("我是哈士奇");}
}
class Sheep implements Animal{@Overridepublic void whichAnimal() {System.out.println("我是喜羊羊");}
}
public class Test2 {public static void whoAnimal(Animal animal){animal.whichAnimal();}public static void main(String[] args) {Cat cat = new Cat();whoAnimal(cat);whoAnimal(new Dog());whoAnimal(new Sheep());}
}
结果演示:

多接口
在Java中,一个类可以继承多个接口,使用implements修饰,并用逗号,隔开。(这样可以解决Java多继承的问题)
请看多接口继承的例子:
interface Engine {void start();void stop();
}
interface Navigation {void navigate();
}
interface MusicPlayer {void playMusic();
}
// 定义 Car 类实现 Engine、Navigation 和 MusicPlayer 接口
class Car implements Engine, Navigation, MusicPlayer {@Overridepublic void start() {System.out.println("启动发动机");}@Overridepublic void stop() {System.out.println("停止发动机");}@Overridepublic void navigate() {System.out.println("导航中");}@Overridepublic void playMusic() {System.out.println("播放音乐");}
}public class Main {public static void main(String[] args) {Car car = new Car();car.start();car.stop();car.navigate();car.playMusic();}
}
接口间的继承
java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承,所以接口间的继承解决了多继承的目的。
接口继承的优势在于,它可以通过组合不同的接口来实现一种类似多继承的行为。一个类可以实现多个接口,从而获得多个接口中定义的方法和常量,将多个不同接口的特性组合到一个类中。
下面是一个多接口继承的例子,请看:
interface A {void methodA();
}interface B extends A {void methodB();
}interface C {void methodC();
}interface D extends B, C {void methodD();
}class MyClass implements D {@Overridepublic void methodA() {System.out.println("方法A");}@Overridepublic void methodB() {System.out.println("方法B");}@Overridepublic void methodC() {System.out.println("方法C");}@Overridepublic void methodD() {System.out.println("方法D");}
}
类通过多接口继承可以获得多个接口中方法和常量的能力,同时也展示了接口之间的继承关系可以形成层次结构。通过接口的多继承和继承链,我们可以在类中组合多个接口的行为,实现更高级别的抽象和模块化的设计。
三、抽象类和接口的区别
抽象类和接口的区别如下:
- 抽象类中可以包好普通类所能包含的成员方法;但是接口中的方法必须是抽象的
- 抽象类中的成员变量可以是各种类型的;但是接口中的成员变量必须是
public static final修饰的 - 抽象类只能单继承;但是接口是可以做到多实现的,从而达到多继承的效果
好了,本文就这到这里啦,再见啦友友们!!!
相关文章:
【Java基础】抽象类和接口的使用
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区讨论💌 目录 一、抽象类抽象类概念…...
Golang的性能优化
欢迎,学习者们,来到Golang性能优化的令人兴奋的世界!作为开发者,我们都努力创建高效、闪电般快速的应用程序,以提供出色的用户体验。在本文中,我们将探讨优化Golang应用程序性能的基本技巧。所以࿰…...
实现两栏布局的五种方式
本文节选自我的博客:实现两栏布局的五种方式 💖 作者简介:大家好,我是MilesChen,偏前端的全栈开发者。📝 CSDN主页:爱吃糖的猫🔥📣 我的博客:爱吃糖的猫&…...
博物馆门票预约APP的设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...
【AI视野·今日Robot 机器人论文速览 第四十四期】Fri, 29 Sep 2023
AI视野今日CS.Robotics 机器人学论文速览 Fri, 29 Sep 2023 Totally 38 papers 👉上期速览✈更多精彩请移步主页 Interesting: 📚NCF,基于Neural Contact Fields神经接触场的方法实现有效的外部接触估计和插入操作。 (from FAIR ) 操作插入处理结果&am…...
一维数组和二维数组的使用(char类型)
目录 导读1. 字符数组1.1 字符数组的创建1.2 字符数组的初始化1.3 不同初始化在内存中的不同1.3.1 strlen测试1.3.2 sizeof测试1.3.3 差异原因 1.4 字符数组的使用 2. 数组越界3. 数组作为函数参数博主有话说 导读 我们在前面讲到了 int 类型的数组的创建和使用: 一…...
1.基本概念 进入Java的世界
1.1 Java的工作方式 1.2 Java的程序结构 类存于源文件里面,方法存于类中,语句(statement)存于方法中 源文件(扩展名为.java)带有类的定义。类用来表示程序的一个组件,小程序或许只会有一个类…...
程序在线报刊第一期
文章目录 程序在线报刊第一期排序算法:优化数据处理效率的核心技术回顾区块链技术:去中心化引领数字经济新时代展望AI未来:智能化时代的无限可能 程序在线报刊第一期 排序算法:优化数据处理效率的核心技术 近年来,随…...
k8s 拉取镜像报错 no basic auth credentials
文章目录 [toc]基于现有凭据创建 Secret通过命令行创建 Secretpod 使用指定 secret 认证私有镜像仓库 省流提醒: 本次解决的问题是 docker login 可以正常登录,docker pull 也可以正常拉取镜像,只是 k8s 在启动 pod 的时候,没有指…...
Koa处理请求数据
在开发中,后端接收到请求参数后,需要解析参数。请求分为很多种类型,比如常见的get和post。 请求参数 Koa本身可以解析get请求参数,不能解析post请求参数。例如: router.get(/api/get/userInfo, async (context) >…...
关于浮点数的 fld、fadd、fstp 汇编指令介绍
文章目录 FLDFADDFSTP FLD, FADD 和 FSTP 常在一起出现,用于 float 运算。组合实现浮点数的加载、加法运算和保存 FLD FLD 指令用于将 浮点数 从内存加载到浮点寄存器栈(FPU Stack)中。它的使用方式如下: FLD <源内存地址&g…...
知识图谱小白入门(1):neo4j的安装与CQL的使用
文章目录 序一、安装neo4j1.1 下载neo4j1.2 安装JDK1.3 BUG:dbms failed to start 二、CQL语法2.1 CQL语法创建节点查询节点创建关系查询关系2.2 习题 习题答案 序 知识图谱,是一种实体间的信息与关系知识的网状结构,借用图论中点与边的概念…...
一个用java的get请求
java发送一个get请求,请求参数classyanfa,使用Authorization认证,在Request Header里填充Authorization: Bearer {token}进行请求认证,token为:sadagdagdgdgfagfd ,另外在Header里补充App标识,X…...
作为SiteGPT替代品,HelpLook的优势是什么?
在当今快节奏的数字化世界中,企业不断寻求创新方式来简化运营并增强客户体验。由于聊天机器人能够自动化任务、提供快速响应并提供个性化互动,它们在业务运营中的使用变得非常重要。因此,企业越来越意识到像SiteGPT和HelpLook这样高效的聊天机…...
uni-app:实现页面效果2(canvas绘制,根据页面宽度调整元素位置)
效果 代码 <template><view><!-- 车搭配指示器-双显 --><view class"content_position"><view class"content"><view class"SN"><view class"SN_title">设备1</view><view class…...
【24种设计模式】责任链模式(Chain of Responsibility Pattern)
责任链模式是一种行为设计模式,它允许你将请求沿着处理链进行传递,直到有一个处理者能够处理该请求为止。这种模式将请求的发送者和接收者解耦,使多个对象都有机会处理该请求。 责任链模式的结构 责任链模式由以下几个角色组成:…...
微信小程序一对多个页面间传递数据进行通信,事件触发的实现方法
在有些场景下,使用组件间通信或者组件和页面间通信并不可行。比如我需要只有一个websocket实例,并且需要向多个页面传递我接收到的消息。 下面的方法是一个页面向其它页面(触发事件)传递数据,其它页面也可以向这个页面…...
软件测试之Python基础学习
目录 一、Python基础 Python简介、环境搭建及包管理 Python简介 环境搭建 包管理 Python基本语法 缩进(Python有非常严格的要求) 一行多条语句 断行 注释 变量 基本数据类型(6种) 1. 数字Number 2. 字符串String 3. 列表List 4. 元组Tuple 序列相关操作方法 …...
模块化编程+LCD1602调试工具——“51单片机”
各位CSDN的uu们你们好呀,小雅兰又来啦,刚刚学完静态数码管显示和动态数码管显示,感觉真不错呢,下面,小雅兰就要开始学习模块化编程以及LCD1602调试工具的知识了,让我们进入51单片机的世界吧!&am…...
【Linux】UDP的服务端 + 客户端
文章目录 📖 前言1. TCP和UDP2. 网络字节序2.1 大小端字节序:2.2 转换接口: 3. socket接口3.1 sockaddr结构:3.2 配置sockaddr_in:3.3 inet_addr:3.4 inet_ntoa:3.5 bind绑定: 4. 服…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
手动给中文分词和 直接用神经网络RNN做有什么区别
手动分词和基于神经网络(如 RNN)的自动分词在原理、实现方式和效果上有显著差异,以下是核心对比: 1. 实现原理对比 对比维度手动分词(规则 / 词典驱动)神经网络 RNN 分词(数据驱动)…...
基于 HTTP 的单向流式通信协议SSE详解
SSE(Server-Sent Events)详解 🧠 什么是 SSE? SSE(Server-Sent Events) 是 HTML5 标准中定义的一种通信机制,它允许服务器主动将事件推送给客户端(浏览器)。与传统的 H…...
