当前位置: 首页 > 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. 图论:割边(桥) 边双连通分量 【解题思路】 每个草场是一个顶点,草场之间的双向路是无向边,该…...

【2026年最新600套毕设项目分享】微信小程序的民大食堂用餐综合服务平台(30126)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 项目演示视频2 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运…...

数字阅读革命:fanqienovel-downloader如何重塑你的小说收藏体验

数字阅读革命:fanqienovel-downloader如何重塑你的小说收藏体验 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 在信息爆炸的时代,我们每天消费着海量的数字内容&am…...

告别ROS安装噩梦:用小鱼的一键脚本在Ubuntu 22.04上5分钟搞定ROS2 Humble

5分钟征服ROS2 Humble:小鱼一键脚本的极简安装哲学 第一次接触ROS时,我盯着官方文档里密密麻麻的依赖项和时不时报错的rosdep,差点以为自己在破解某种加密系统。直到发现小鱼的那个绿色终端界面——原来安装ROS可以像喝咖啡一样简单。这不是又…...

保姆级教程:在RK3588 EVB开发板上手把手配置4屏拼接(附HwComposerEnv.xml详解)

RK3588开发板4屏拼接实战:从硬件连接到HwComposerEnv.xml全解析 第一次拿到RK3588开发板时,最让我兴奋的就是它强大的多屏输出能力。想象一下,用一块小小的开发板同时驱动四个显示器,构建一个沉浸式的数字看板或者多任务工作环境&…...

经济研究论文排版终极指南:如何用LaTeX模板快速完成学术投稿

经济研究论文排版终极指南:如何用LaTeX模板快速完成学术投稿 【免费下载链接】Chinese-ERJ 《经济研究》杂志 LaTeX 论文模板 - LaTeX Template for Economic Research Journal 项目地址: https://gitcode.com/gh_mirrors/ch/Chinese-ERJ 还在为《经济研究》…...

揭秘ComfyUI-SUPIR核心技术:从架构设计到实战调优的深度解析

揭秘ComfyUI-SUPIR核心技术:从架构设计到实战调优的深度解析 【免费下载链接】ComfyUI-SUPIR SUPIR upscaling wrapper for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-SUPIR ComfyUI-SUPIR作为ComfyUI生态中专业的图像超分辨率插件&…...

为什么你客户越多,业绩反而越差?

你有没有遇到过这种情况:市场说:今年线索翻倍了销售说:每天忙到飞起老板看报表:客户数越来越多但月底一看—— 业绩没涨,甚至还在掉。很多人第一反应是: 是不是销售不行?是不是产品不行&#xf…...

告别模组混乱!XXMI启动器:一键管理6款热门二次元游戏的神器

告别模组混乱!XXMI启动器:一键管理6款热门二次元游戏的神器 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 你是否曾经为管理多款游戏的模组而感到头疼&a…...

别再纠结选哪种了!立体视觉、结构光、TOF深度相机,看完这篇保姆级对比就知道你的项目该用谁

深度相机技术选型实战指南:立体视觉、结构光与TOF的黄金分割点 当你的机器人项目需要一双"慧眼"来感知三维世界时,摆在面前的技术选项往往令人眼花缭乱。市面上主流的深度感知方案——立体视觉、结构光和TOF,就像三种不同性格的助手…...

Cesium与WebXR融合:从零构建VR地理空间应用

1. 为什么需要Cesium与WebXR的融合? 我第一次在VR头盔里看到三维地球的时候,整个人都惊呆了。那种站在太空俯瞰地球的沉浸感,完全颠覆了传统屏幕的浏览体验。但当我尝试把现有的Cesium项目移植到VR环境时,发现事情没那么简单——视…...