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

Java——抽象类

在Java中,抽象类(Abstract Class) 是一种特殊的类,用于定义部分实现的类结构,同时允许子类提供具体的实现。抽象类通常用于定义通用的行为或属性,而将具体的实现细节留给子类。


1. 抽象类的定义

  • 语法
    abstract class 类名 {// 字段// 构造器// 具体方法// 抽象方法
    }
    
  • 特点
    • 抽象类用abstract关键字修饰。
    • 抽象类可以包含抽象方法(没有方法体的方法)和具体方法(有方法体的方法)。
    • 抽象类不能被实例化,只能被继承。

2. 抽象类的特性

2.1 抽象方法
  • 定义:抽象方法是没有方法体的方法,用abstract关键字修饰。
  • 特点
    • 抽象方法必须在抽象类中定义。
    • 子类必须重写抽象方法(除非子类也是抽象类)。
示例
abstract class Animal {// 抽象方法public abstract void makeSound();// 具体方法public void sleep() {System.out.println("Animal is sleeping.");}
}

2.2 具体方法
  • 定义:抽象类可以包含具体方法(有方法体的方法)。
  • 特点
    • 具体方法可以被子类直接继承或重写。
    • 抽象类可以提供通用的实现,减少代码重复。
示例
abstract class Animal {// 具体方法public void eat() {System.out.println("Animal is eating.");}
}

2.3 字段和构造器
  • 字段:抽象类可以包含字段(成员变量)。
  • 构造器:抽象类可以有构造器,但不能直接实例化。构造器用于初始化字段或供子类调用。
示例
abstract class Animal {private String name;// 构造器public Animal(String name) {this.name = name;}public String getName() {return name;}
}

3. 抽象类的使用

3.1 继承抽象类
  • 子类必须重写抽象类中的所有抽象方法(除非子类也是抽象类)。
  • 子类可以继承抽象类的具体方法和字段。
示例
class Dog extends Animal {public Dog(String name) {super(name); // 调用父类构造器}@Overridepublic void makeSound() {System.out.println("Woof! Woof!");}
}public class Main {public static void main(String[] args) {Dog dog = new Dog("Buddy");dog.makeSound(); // 输出: Woof! Woof!dog.eat();      // 输出: Animal is eating.}
}

3.2 抽象类的多态
  • 抽象类可以作为引用类型,指向其子类对象。
  • 通过抽象类引用调用方法时,实际执行的是子类的方法。
示例
Animal myAnimal = new Dog("Buddy");
myAnimal.makeSound(); // 输出: Woof! Woof!

4. 抽象类与接口的区别

特性抽象类接口
关键字abstract classinterface
方法可以包含抽象方法和具体方法Java 8之前只能包含抽象方法
字段可以包含普通字段和静态字段只能包含静态常量(public static final
构造器可以有构造器不能有构造器
多继承不支持多继承支持多继承(一个类可以实现多个接口)
默认方法不支持默认方法Java 8支持默认方法(default方法)
设计目的定义通用的类结构定义行为规范

5. 抽象类的应用场景

  1. 定义通用行为

    • 抽象类可以定义通用的方法和字段,供子类继承。
    • 示例:Animal类定义eat()sleep()方法,子类DogCat继承这些方法。
  2. 强制子类实现特定行为

    • 抽象类可以定义抽象方法,强制子类提供具体实现。
    • 示例:Animal类定义makeSound()抽象方法,子类DogCat必须实现该方法。
  3. 代码复用

    • 抽象类可以提供部分实现,减少子类的代码重复。
    • 示例:Animal类提供eat()方法的默认实现,子类可以直接使用或重写。
  4. 模板方法模式

    • 抽象类可以定义算法的骨架,将具体步骤延迟到子类实现。
    • 示例:Game类定义initialize()start()end()方法,子类FootballCricket实现具体逻辑。

6. 抽象类的注意事项

  1. 不能实例化

    • 抽象类不能直接创建对象,只能通过子类实例化。
    • 示例:Animal animal = new Animal(); 会编译错误。
  2. 构造器的作用

    • 抽象类的构造器用于初始化字段或供子类调用,不能直接实例化。
  3. 抽象方法的实现

    • 子类必须实现抽象类中的所有抽象方法(除非子类也是抽象类)。
  4. 与接口的结合

    • 抽象类可以实现接口,提供部分或全部接口方法的实现。

7. 总结

抽象类是Java中用于定义部分实现的类结构的重要工具。它通过抽象方法和具体方法的结合,提供了代码复用和强制子类实现特定行为的能力。抽象类适用于定义通用行为、强制子类实现、代码复用和模板方法模式等场景。

相关文章:

Java——抽象类

在Java中,抽象类(Abstract Class) 是一种特殊的类,用于定义部分实现的类结构,同时允许子类提供具体的实现。抽象类通常用于定义通用的行为或属性,而将具体的实现细节留给子类。 1. 抽象类的定义 语法&…...

DeepSeek在初创企业、教育和数字营销领域应用思考

如今,像 DeepSeek 这样的人工智能工具正在改变企业的运营方式,优化流程并显著提高生产力。通过重复任务的自动化、大量数据的分析以及内容创建效率的提高,组织正在寻找新的竞争和卓越方式。本文介绍了 DeepSeek 如何用于提高三个关键领域的生…...

java开发——为什么要使用动态代理?

举个例子:假如有一个杀手专杀男的,不杀女的。代码如下: public interface Killer {void kill(String name, String sex);void watch(String name); }public class ManKiller implements Killer {Overridepublic void kill(String name, Stri…...

c++中,什么时候应该使用mutable关键字?

在 C 中,mutable 关键字用于修饰类的成员变量,允许在 const 成员函数中修改这些变量。它的核心作用是区分 物理常量性(对象内存不可修改)和 逻辑常量性(对象对外表现的状态不变)。以下是详细解析&#xff1…...

deepseek本地部署,ragflow,docker

先下载ollama 1.官网下载 deepseek-r1:14bhttps://ollama.com/library/deepseek-r1:14b 2.GitHub下载GitHub - ollama/ollama: Get up and running with Llama 3.3, DeepSeek-R1, Phi-4, Gemma 2, and other large language models. 两种方式 安装完后,cmd-&g…...

智能优化算法:莲花算法(Lotus flower algorithm,LFA)介绍,提供MATLAB代码

一、 莲花算法 1.1 算法原理 莲花算法(Lotus flower algorithm,LFA)是一种受自然启发的优化算法,其灵感来源于莲花的自清洁特性和授粉过程。莲花的自清洁特性,即所谓的“莲花效应”,是由其叶片表面的微纳…...

通过AI辅助生成PPT (by quqi99)

作者:张华 发表于:2025-02-23 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) 问题 媳妇需要将一个pdf文件中的某些部分做成PPT课件,我在想是…...

P9631 [ICPC 2020 Nanjing R] Just Another Game of Stones Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​),有 m m m 个操作分两种: chmax ⁡ ( l , r , k ) \operatorname{chmax}(l,r,k) chmax(l,r,k):对每个 i ∈ [ l , r ] i \in [l,r] i∈[l,…...

nodejs:vue 3 + vite 作为前端,将 html 填入<iframe>,在线查询英汉词典

向 doubao.com/chat/ 提问: node.js js-mdict 作为后端,vue 3 vite 作为前端,编写在线查询英汉词典 后端部分(express js-mdict ) 详见上一篇:nodejs:express js-mdict 作为后端&#xff…...

QEMU源码全解析 —— 内存虚拟化(18)

接前一篇文章:QEMU源码全解析 —— 内存虚拟化(17) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 QEMU内存管理模型...

Spring Boot 日志管理(官网文档解读)

摘要 本篇文章详细介绍了SpringBoot 日志管理相关的内容,文章主要参考官网文章的描述内容,并在其基础上进行一定的总结和拓展,以方便学习Spring Boot 的小伙伴能快速掌握Spring Boot 日志管理相关的内容。 日志实现方式 Sping Boot 的日志管…...

MATLAB进阶之路:数据导入与处理

在MATLAB的学习旅程中,我们已经初步了解了它的基础操作。如今,我们将沿着这条充满惊喜的道路,迈向下一个重要的站点——数据导入与处理。这部分内容就像是为MATLAB注入了强大的能量,使其能够从现实的数据世界中汲取信息,然后像一位智慧的魔法师一样,巧妙地处理这些数据,…...

fcntl()函数的概念和使用案例 c语言

在 Linux 系统编程中,fcntl() 函数(File Control)是用于操作文件描述符的核心函数,可控制文件或套接字的底层属性。它支持多种操作,包括设置非阻塞模式、获取/设置文件状态标志、管理文件锁等。以下是详细概念和使用案…...

Linux红帽:RHCSA认证知识讲解(一)RedHat背景与环境配置

Linux红帽:RHCSA认证知识讲解(一)RedHat背景与环境配置 前言一、RedHat公司背景二、RedHat环境安装步骤三、windows使用远程工具连接环境并上传文件到redhat方法: 前言 在接下来的博客中,我们从基础开始将介绍红帽Linu…...

Windows11安装GPU版本Pytorch2.6教程

1: 准备工作 针对已经安装好的Windows11系统,先检查Nvidia驱动和使用的CUDA版本情况。先打开Windows PowerShell,通过nvidia-smi命令查看GPU的情况,结果如下图1所示,从结果中可知使用的CUDA版本为12.8。 图1:检测安装…...

网络传输的七层协议

网络传输的七层协议是 OSI模型(开放系统互联模型) 中的七个层次,每一层都负责不同的网络功能。具体如下: 物理层(Physical Layer) 负责在物理媒介上传输比特流,即将数据以电信号、光信号等形式在…...

【蓝桥杯集训·每日一题2025】 AcWing 6134. 哞叫时间II python

6134. 哞叫时间II Week 1 2月20日 农夫约翰正在试图向埃尔茜描述他最喜欢的 USACO 竞赛,但她很难理解为什么他这么喜欢它。 他说「竞赛中我最喜欢的部分是贝茜说『现在是哞哞时间』并在整个竞赛中一直哞哞叫」。 埃尔茜仍然不理解,所以农夫约翰将竞赛…...

Spring Boot数据访问(JDBC)全解析:从基础配置到高级调优

文章目录 引言一、Spring Boot JDBC核心架构1.1 核心组件关系图1.2 自动配置逻辑 二、基础配置实践2.1 数据源配置2.2 多数据源配置 三、JdbcTemplate深度使用3.1 基础CRUD操作3.2 批处理优化 四、事务管理4.1 声明式事务4.2 事务传播机制 五、异常处理5.1 Spring异常体系5.2 自…...

三数之和:经典问题的多种优化策略

三数之和:经典问题的多种优化策略 大家好,我是Echo_Wish。今天我们来聊一个经典的算法问题——三数之和(3Sum)。它是许多面试和算法竞赛中常见的问题之一,也常常考察我们对算法优化的理解和技巧。我们不仅要解决问题&…...

信息学奥赛一本通 1520:【 例 1】分离的路径 | 洛谷 P2860 [USACO06JAN]Redundant Paths G

【题目链接】 ybt 1520:【 例 1】分离的路径 洛谷 P2860 [USACO06JAN]Redundant Paths G 【题目考点】 1. 图论:割边(桥) 边双连通分量 【解题思路】 每个草场是一个顶点,草场之间的双向路是无向边,该…...

别再只盯着CMMI认证了!聊聊CMMI-DEV、SVC、ACQ三个模型到底该怎么选?

CMMI三大模型深度解析:如何为你的企业精准匹配最佳实践框架? 当企业决策者面对CMMI认证时,往往陷入一个典型误区——将CMMI-DEV视为唯一选择。事实上,CMMI研究院早在2010年就针对不同业务场景推出了三大专业模型:面向软…...

BiliDownloader:5分钟掌握B站视频下载的终极解决方案

BiliDownloader:5分钟掌握B站视频下载的终极解决方案 【免费下载链接】BiliDownloader BiliDownloader是一款界面精简,操作简单且高速下载的b站下载器 项目地址: https://gitcode.com/gh_mirrors/bi/BiliDownloader BiliDownloader是一款专为B站视…...

别被128TB吓到!深入浅出解读Linux /proc/kcore的ELF内存布局与物理内存映射

别被128TB吓到!深入浅出解读Linux /proc/kcore的ELF内存布局与物理内存映射 第一次在终端里敲下ls -lh /proc/kcore时,那个醒目的128TB文件大小确实让我倒吸一口凉气——我的硬盘总共才1TB,这玩意儿是怎么存在的?相信不少Linux开发…...

家电工厂10人设计团队应用云飞云智能共享云桌面:从3D建模到模具开发的无缝衔接

一、制造业现有困境在家电制造行业,产品更新换代迅速,设计周期不断压缩,对设计团队的协作效率和创新能力提出了更高要求。对于10人规模的家电设计团队而言,如何实现从3D建模到模具开发的高效、无缝衔接,成为提升整体竞…...

手把手教你用华为/华三交换机配置M-LAG(含Peer-Link与Keepalive避坑指南)

华为/华三交换机M-LAG实战配置与排错全指南 在数据中心和园区网络的高可用架构设计中,M-LAG(Multichassis Link Aggregation Group)技术已经成为构建双活系统的首选方案。不同于传统的堆叠技术,M-LAG实现了真正的跨设备链路聚合&a…...

如何打破B站缓存视频的格式枷锁?m4s-converter让你重获观看自由

如何打破B站缓存视频的格式枷锁?m4s-converter让你重获观看自由 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 当你在B站缓存了珍贵…...

告别敏捷!分布式团队正在回归瀑布制的真相——软件测试视角的深度剖析

一场正在发生的范式回摆在敏捷宣言问世二十余年后,软件工程领域正悄然经历一场静默但深刻的反思。尤其是在成员遍布全球、时区交错的分布式团队中,敏捷方法论所描绘的“理想国”正遭遇现实的无情拷问。每日站会沦为形式主义的远程汇报,迭代周…...

用FPGA和Verilog实现一个浪漫的8路呼吸流水灯(基于有限状态机FSM设计)

用FPGA和Verilog打造浪漫呼吸流水灯:有限状态机的艺术实践 当冰冷的电子元件遇上温暖的光效设计,FPGA开发便从枯燥的实验室走进了生活美学领域。本文将带你用Verilog硬件描述语言,基于有限状态机(FSM)设计一个具有呼吸渐变效果的8路LED流水灯…...

TI C2000开发避坑指南:当SysConfig生成的board.c太大,导致CC8编译报错怎么办?

TI C2000开发实战:SysConfig生成代码过大导致CC8内存溢出的高效解决方案 第一次用TI的SysConfig工具配置完PWM和ADC外设,满心欢喜点击编译,结果跳出一行刺眼的错误:error #10099-D: program will not fit into available memory。…...

10大好用班组4m变更管理系统盘点!班组4m变更管理系统选型避坑指南

在制造业数字化转型的深水区,班组4m变更管理已成为保障生产连续性与质量稳定性的核心环节。面对日益复杂的生产环境,企业急需一套成熟的班组4m变更管理系统来应对人员、设备、物料及方法的变动风险。本文将为您带来2026年10大好用班组4m变更管理系统盘点…...