当前位置: 首页 > article >正文

抽象类与抽象方法详解

目录

一、 基本概念

1.抽象类(Abstract Class):

2.抽象方法(Abstract Method):

二、示例代码

抽象类

抽象方法

三、抽象类的使用场景

四、 抽象类与接口的对比

五、注意事项

六、总结


一、 基本概念

1.抽象类(Abstract Class):

定义:抽象类是用 abstract 关键字修饰的类。抽象类不能被实例化,只能通过子类继承来使用。它可以包含抽象方法(无实现)和具体方法(有实现)。它的主要目的是为子类提供一个通用的模板和结构。
特点:
抽象类中可以包含普通方法(有实现的方法)和抽象方法(没有实现的方法)。
抽象类中可以有成员变量、构造方法、静态方法和非静态方法。
抽象类的一个重要用途是提供一个统一的接口,强制子类实现某些方法。

①不可实例化:由于抽象类可能包含未实现的抽象方法,因此不能直接创建其实例。
②构造器存在:尽管抽象类不能被实例化,但它仍然可以拥有构造器,用于初始化其子类对象时调用。
③部分实现:抽象类可以包含具体的实现代码,这意味着它可以提供一些默认的行为给子类使用。
④强制性继承:任何继承自抽象类的非抽象子类都必须实现该抽象类中的所有抽象方法,除非这个子类也是抽象的。

2.抽象方法(Abstract Method):

定义:

abstract 关键字修饰的方法,没有方法体(即没有 { } 包裹的实现代码),必须在子类中被重写(Override)。
特点:
抽象方法必须定义在抽象类中,普通类不能包含抽象方法。
抽象方法的目的是为子类提供一个统一的接口,子类必须重写这些方法。
如果一个子类继承了包含抽象方法的抽象类,但没有重写所有的抽象方法,那么子类也必须声明为抽象类。

①无方法体:抽象方法只包含方法声明,不包含方法的具体实现。
②强制重写:如果一个类包含了抽象方法,则这个类也必须声明为抽象类;任何继承此类的非抽象子类都必须提供抽象方法的具体实现。


二、示例代码

抽象类

  • 定义方式

    public abstract class Animal { // 抽象方法public abstract void makeSound();// 具体方法public void sleep() {System.out.println("动物在睡觉");}
    }
  • 核心规则

    1. 抽象类中可以有普通成员变量、具体方法、构造方法、静态方法。

    2. 包含抽象方法的类必须是抽象类,但抽象类可以不包含抽象方法。

    3. 子类继承抽象类后,必须实现所有抽象方法,否则子类也必须声明为抽象类。


抽象方法

  • 定义方式

    public abstract void eat(); // 没有方法体,以分号结尾
  • 核心规则

    1. 抽象方法只能存在于抽象类中。

    2. 子类必须重写抽象方法,否则会编译报错。

    3. 抽象方法不能是 privatestatic 或 final 的(这些修饰符与继承和多态冲突)

三、抽象类的使用场景

  • 模板方法模式:定义算法的骨架,将某些步骤延迟到子类实现。

    抽象类Game
    
    public abstract class Game {// 模板方法(定义流程)public final void play() {initialize();start();end();}// 抽象方法(子类必须实现)protected abstract void initialize();protected abstract void start();// 具体方法(公共逻辑)private void end() {System.out.println("游戏结束");}
    }
    子类Chess
    
    class Chess extends Game {@Overrideprotected void initialize() { System.out.println("初始化棋盘"); }@Overrideprotected void start() { System.out.println("开始下棋"); }
    }
     
  • 公共代码复用:多个子类共享某些方法的实现。

    抽象类Vehicle:
    
    public abstract class Vehicle {// 公共属性private String brand;// 公共方法public void startEngine() {System.out.println("引擎启动");}// 抽象方法(子类自定义)public abstract void drive();
    }
    子类Car:
    
    class Car extends Vehicle {@Overridepublic void drive() { System.out.println("汽车行驶"); }
    }

四、 抽象类与接口的对比

以下是修正后的对比表格,结合Java最新特性(至Java 17)和设计语义优化:

特性抽象类接口
继承/实现方式单继承(extends)多实现(implements)
方法类型可包含:
- 抽象方法
- 具体方法(默认实现)
可包含:
- 抽象方法
- 默认方法(default
- 静态方法(static
- 私有方法(Java 9+)
成员变量可包含:
- 普通成员变量
- 常量
仅允许常量:
默认隐式 public static final
构造方法可以有构造方法(用于子类初始化)不能有构造方法
访问修饰符方法/变量可自定义访问修饰符(如 protected方法默认 public(不可用 private/protected
设计语义定义类的本质特征(is-a关系)
例:DogAnimal
定义能力契约(can-do关系)
例:Serializable表示可序列化能力
典型用途封装通用逻辑和状态(模板方法模式)定义跨类别的行为约定(策略模式)
Java版本演进核心特性自Java 1.0未变逐步增强:

适用场景

  • 抽象类:多个子类有共享的代码逻辑或属性时(如 Animal 作为基类)。

  • 接口:定义不相关类的共同行为(如 FlyableSwimmable)。


五、注意事项

  1. 抽象类的构造方法
    抽象类可以有构造方法,但只能被其子类调用。

    抽象类Animal:
    
    abstract class Animal {public Animal(String name) { /* 初始化逻辑 */ }
    }
    子类Dog:
    
    class Dog extends Animal {public Dog() { super("狗"); }
    }
  2. 静态方法的使用
    抽象类中可以定义静态方法,但静态方法不能被重写。

    abstract class Logger {public static void log(String message) {System.out.println("[LOG] " + message);}
    }class FileLogger extends Logger {// 不能重写log方法,但可以直接调用Logger.log()
    }
  3. 避免过度抽象
    只有需要强制子类实现特定行为时,才使用抽象方法。不要为未明确的需求提前设计抽象。


六、总结

  • 抽象类:提供代码复用和模板设计,适合定义类族(如动物、车辆)的公共逻辑。

  • 抽象方法:强制子类实现特定行为,确保多态的正确性。

  • 与接口的区别:抽象类强调“是什么”,接口强调“能做什么”。

核心价值
通过抽象类与抽象方法,可以构建灵活、可扩展的代码结构,符合面向对象设计的开闭原则(OCP)——对扩展开放,对修改关闭。

相关文章:

抽象类与抽象方法详解

目录 一、 基本概念 1.抽象类(Abstract Class): 2.抽象方法(Abstract Method): 二、示例代码 抽象类 抽象方法 三、抽象类的使用场景 四、 抽象类与接口的对比 五、注意事项 六、总结 一、 基本概…...

受击反馈HitReact、死亡效果Death Dissolve、Floating伤害值Text(末尾附 客户端RPC )

受击反馈HitReact 设置角色受击标签 (GameplayTag基本了解待补充) 角色监听标签并设置移动速度 创建一个受击技能,并应用GE 实现设置角色的受击蒙太奇动画 实现角色受击时播放蒙太奇动画,为了保证通用性,将其设置为一个函数,并…...

应用程序中处理文件上传的方法

在应用程序中处理文件上传通常涉及以下几个步骤: 一、前端准备 前端负责收集文件,并通过 HTTP 请求将其发送到服务器。常见的方法包括: ①HTML <form>; 表单:使用 enctype="multipart/form-data" 属性指定表单支持文件上传。 ②JavaScript (AJAX):可以使…...

Java进阶six junit单元测试,反射,注解,动态代理

前言 Java进阶课程的第六篇&#xff0c;也是最后一篇&#xff0c;junit单元测试,反射,注解,动态代理相关内容 包含知识点 junit单元测试 反射 1.内部类Student&#xff1a; 包含私有/公共字段和方法 包含默认构造器和私有构造器 2.获取Class对象的三种方式&#xff1a; .…...

STM32 LED呼吸灯

接线图&#xff1a; 这里将正极接到PA0引脚上&#xff0c;负极接到GND&#xff0c;这样就高电平点亮LED&#xff0c;低电平熄灭。 占空比越大&#xff0c;LED越亮&#xff0c;占空比越小&#xff0c;LED越暗 PWM初始化配置 输出比较函数介绍&#xff1a; 用这四个函数配置输…...

栈和队列特别篇:栈和队列的经典算法问题

图均为手绘,代码基于vs2022实现 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 数据结构初探:链表之双向链表篇 链表特别篇:链表经典算法问题 数据结构:栈篇 数据结构:队列篇 文章目录 系列文章目录前言一.有效的括号(leetcode 20)二.用队列实现栈(leetcode…...

用一个例子详细说明python单例模式

单例模式是一种设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。这在需要控制资源&#xff08;如数据库连接、文件系统等&#xff09;的访问时非常有用。 下面是一个使用Python实现单例模式的例子&#xff1a; class Singleton:…...

Kotlin 委托详解

Kotlin 委托详解 引言 Kotlin 作为一种现代化的编程语言&#xff0c;在 Android 开发等领域得到了广泛的应用。在 Kotlin 中&#xff0c;委托&#xff08;Delegation&#xff09;是一种强大的特性&#xff0c;它可以让我们以更简洁的方式实现代码的复用和扩展。本文将详细解析…...

什么是词嵌入?Word2Vec、GloVe 与 FastText 的区别

自然语言处理(NLP)领域的核心问题之一,是如何将人类的语言转换成计算机可以理解的数值形式,而词嵌入(Word Embedding)正是为了解决这个问题的重要技术。本文将详细讲解词嵌入的概念及其经典模型(Word2Vec、GloVe 和 FastText)的原理与区别。 1. 什么是词嵌入(Word Em…...

2024年数据记录

笔者注册时间超过98.06%的用户 CSDN 原力是衡量一个用户在 CSDN 的贡献和影响力的系统&#xff0c;笔者原力值超过99.99%的用户 其他年度数据...

DBO优化最近邻分类预测matlab

蜣螂优化算法&#xff08;Dung Beetle Optimizer&#xff0c;简称 DBO&#xff09;作为一种新兴的群智能优化算法&#xff0c;于 2022 年末被提出&#xff0c;其灵感主要来源于蜣螂的滚球、跳舞、觅食、偷窃以及繁殖等行为。 本次使用的数据为 Excel 格式的分类数据集。该数据…...

Harbor 部署

harbor镜像仓库搭建 版本v2.10.3 文章目录 一. docker 安装 harbor1. harbor 配置http访问1.1 下载harbor二进制包1.2 修改配置文件1.3 运行1.4 访问 2.【可选】harbor 配置https访问2.1 自签证书2.1 修改配置文件2.3 修改hosts文件2.4 运行2.5 访问 二. k8s 安装harbor1 .安装…...

PSpice for TI体验

前言 基于 从零开始学 PSpice for TI 仿真工具 - 手把手操作实训课程_哔哩哔哩_bilibili 体验PSpice for TI的功能&#xff0c;并记录下来。文章内容大部分都参考自视频&#xff0c;可以理解成图文版。目前发现是没有支持中文语言&#xff0c;而且部分仿真&#xff0c;时间消耗…...

数据结构与算法 —— 常用算法模版

数据结构与算法 —— 常用算法模版 二分查找素数筛最大公约数与最小公倍数 二分查找 人间若有天堂&#xff0c;大马士革必在其中&#xff1b;天堂若在天空&#xff0c;大马士革必与之齐名。 —— 阿拉伯谚语 算法若有排序&#xff0c;二分查找必在其中&#xff1b;排序若要使用…...

苯乙醇苷类化合物的从头生物合成-文献精读108

Complete pathway elucidation of echinacoside in Cistanche tubulosa and de novo biosynthesis of phenylethanoid glycosides 管花肉苁蓉中松果菊苷全生物合成途径解析及苯乙醇苷类化合物的从头生物合成 摘要 松果菊苷&#xff08;ECH&#xff09;是最具代表性的苯乙醇苷…...

【C++】设计模式详解:单例模式

文章目录 Ⅰ. 设计一个类&#xff0c;不允许被拷贝Ⅱ. 请设计一个类&#xff0c;只能在堆上创建对象Ⅲ. 请设计一个类&#xff0c;只能在栈上创建对象Ⅳ. 请设计一个类&#xff0c;不能被继承Ⅴ. 请设计一个类&#xff0c;只能创建一个对象&#xff08;单例模式&#xff09;&am…...

CAN总线数据采集与分析

CAN总线数据采集与分析 目录 CAN总线数据采集与分析1. 引言2. 数据采集2.1 数据采集简介2.2 数据采集实现3. 数据分析3.1 数据分析简介3.2 数据分析实现4. 数据可视化4.1 数据可视化简介4.2 数据可视化实现5. 案例说明5.1 案例1:数据采集实现5.2 案例2:数据分析实现5.3 案例3…...

解决vsocde ssh远程连接同一ip,不同端口情况下,无法区分的问题

一般服务器会通过镜像分身或者容器的方式&#xff0c;一个ip分出多个端口给多人使用&#xff0c;但如果碰到需要连接同一user&#xff0c;同一个ip,不同端口的情况&#xff0c;vscode就无法识别&#xff0c;如下图所示&#xff0c;vscode无法区分该ip下不同端口的连接&#xff…...

AJAX案例——图片上传个人信息操作

黑马程序员视频地址&#xff1a; AJAX-Day02-11.图片上传https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p26 图片上传 <!-- 文件选择元素 --><input type"file"…...

团体程序设计天梯赛-练习集——L1-029 是不是太胖了

前言 5分级别里面目前做到的最难的一道题&#xff0c;但是非常简单&#xff0c;5分的题看看写点代码就行了。 L1-029 是不是太胖了 据说一个人的标准体重应该是其身高&#xff08;单位&#xff1a;厘米&#xff09;减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数…...

ubuntu20.04.6下运行VLC-Qt例子simple-player

下载examples-master.zip&#xff08;https://github.com/vlc-qt/examples&#xff09;&#xff0c;编译运行simple-player 参考链接&#xff1a; https://blog.csdn.net/szn1316159505/article/details/143743735 本文运行环境 Qt 5.15.2 Qt creator 5.0.2 主要步骤&#xf…...

LabVIEW温度修正部件测试系统

LabVIEW温度修正部件测试系统 这个基于LabVIEW的温度修正部件测试系统旨在解决飞行器温度测量及修正电路的测试需求。该系统的意义在于提供一个可靠的测试平台&#xff0c;用于评估温度修正部件在实际飞行器环境中的性能表现&#xff0c;从而确保飞行器的安全性和可靠性。 系统…...

细说机器学习算法之ROC曲线用于模型评估

系列文章目录 第一章&#xff1a;Pyhton机器学习算法之KNN 第二章&#xff1a;Pyhton机器学习算法之K—Means 第三章&#xff1a;Pyhton机器学习算法之随机森林 第四章&#xff1a;Pyhton机器学习算法之线性回归 第五章&#xff1a;Pyhton机器学习算法之有监督学习与无监督…...

Python3 【装饰器】项目实战:5个新颖的学习案例

Python3 【装饰器】项目实战&#xff1a;5个新颖的学习案例 以下是 5 个使用 Python 装饰器的综合应用项目&#xff0c;这些项目具有新颖性、前瞻性和实用性。每个项目都包含完整的代码、解释说明、测试案例和执行结果。 项目 1&#xff1a;API 请求限流器 描述&#xff1a;实…...

【深度学习】 UNet详解

UNet 是一种经典的卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;架构&#xff0c;专为生物医学图像分割任务设计。该模型于 2015 年由 Olaf Ronneberger 等人在论文《U-Net: Convolutional Networks for Biomedical Image Segmentation》中首次提出&…...

DeepSeek本地部署(windows)

一、下载并安装Ollama 1.下载Ollama Ollama官网:Ollama 点击"Download",会跳转至下载页面。 点击"Download for Windows"。会跳转Github进行下载,如下载速度过慢,可在浏览器安装GitHub加速插件。 2.安装Ollama 双击下载的安装文件,点击"Inst…...

简要介绍C语言/C++的三目运算符

三元运算符是C语言和C中的一种简洁的条件运算符&#xff0c;它的形式为&#xff1a; 条件表达式 ? 表达式1 : 表达式2; 三元运算符的含义 条件表达式&#xff1a;这是一个布尔表达式&#xff0c;通常是一个比较操作&#xff08;如 >、<、 等&#xff09;。 表达式1&am…...

SpringCloud系列教程:微服务的未来(十九)请求限流、线程隔离、Fallback、服务熔断

前言 前言 在现代微服务架构中&#xff0c;系统的高可用性和稳定性至关重要。为了解决系统在高并发请求或服务不可用时出现的性能瓶颈或故障&#xff0c;常常需要使用一些技术手段来保证服务的平稳运行。请求限流、线程隔离、Fallback 和服务熔断是微服务中常用的四种策略&…...

STM32 对射式红外传感器配置

这次用的是STM32F103的开发板&#xff08;这里面的exti.c文件没有how to use this driver 配置说明&#xff09; 对射式红外传感器 由一个红外发光二极管和NPN光电三极管组成&#xff0c;M3固定安装孔&#xff0c;有输出状态指示灯&#xff0c;输出高电平灯灭&#xff0c;输出…...

(动态规划路径基础 最小路径和)leetcode 64

视频教程 1.初始化dp数组&#xff0c;初始化边界 2、从[1行到n-1行][1列到m-1列]依次赋值 #include<vector> #include<algorithm> #include <iostream>using namespace std; int main() {vector<vector<int>> grid { {1,3,1},{1,5,1},{4,2,1}…...