0

0

如何在Java中定义抽象类_abstract关键字与部分实现的设计思想

P粉602998670

P粉602998670

发布时间:2026-03-16 16:04:06

|

909人浏览过

|

来源于php中文网

原创

抽象类必须用abstract修饰,含abstract方法的类必须声明为abstract;abstract类可无abstract方法但失去约束意义;abstract方法不能有方法体、private或static;适合模板方法模式封装固定流程与可变环节。

如何在java中定义抽象类_abstract关键字与部分实现的设计思想

抽象类必须用 abstract 修饰,但不是所有带 abstract 的类都合法

Java 要求:只要类里有一个 abstract 方法,这个类就必须声明为 abstract;反过来,abstract 类可以没有 abstract 方法,但这样设计通常没意义——它就退化成普通类的“假抽象”,失去约束子类行为的作用。

常见错误是漏写 abstract 类修饰符,编译直接报错:error: abstract method in non-abstract class。还有一种隐蔽坑:在 abstract 类里写了 abstract 方法,却忘了加 abstract 关键字(比如写成 void foo(); 而非 abstract void foo();),JVM 会把它当普通方法处理,导致子类不重写也能编译通过,破坏设计意图。

  • abstract 类不能被 new 实例化,哪怕它所有方法都有实现
  • 子类继承 abstract 类,要么自己也声明为 abstract,要么实现全部未实现的 abstract 方法
  • 构造器可以存在,且会被子类 super() 调用——它负责初始化父类中已定义的字段和逻辑

abstract 方法不能有方法体,也不能是 privatestatic

abstract 方法本质是契约,只声明“做什么”,不规定“怎么做”。所以语法上禁止大括号 {},也不允许 private(子类根本看不见)、static(静态方法属于类本身,无法被子类重写)。

典型误用:把工具方法误设为 abstract,比如 abstract static String format(Date d);,编译器会立刻拒绝:illegal combination of modifiers: abstract and static。如果真需要共用逻辑,应该抽成 protectedfinal 的具体方法,在抽象类内部调用。

立即学习Java免费学习笔记(深入)”;

Seed-Music
Seed-Music

字节跳动推出的AI音乐生成与编辑工具

下载
  • abstract 方法默认是 publicprotected,不能显式写 private abstract void foo();
  • 接口里的默认方法(default)和静态方法(static)可共存,但抽象类不支持 default 修饰符
  • 抽象方法的参数、返回类型、异常声明,都会成为子类重写时的强制约束

抽象类适合封装“固定流程 + 可变环节”,比如模板方法模式

这是抽象类最不可替代的场景:把算法骨架写死在 final 方法里,把变化点拆成 abstract 方法交给子类定制。比如一个导出报表的流程:validate() → fetch() → transform() → save(),其中 validate()save() 是通用逻辑,而 fetch()transform() 必须由子类决定数据源和格式。

这时候如果用接口,只能声明方法,没法提供 validate() 这样的复用代码;如果全用具体类,又无法强制子类实现关键步骤。抽象类正好卡在这个中间位置。

  • 模板方法本身应声明为 final,防止子类覆盖整个流程
  • 被子类实现的钩子方法(hook method)用 abstract 声明,确保不被跳过
  • 如果某个环节可选,就用 protected 空实现,而非 abstract,避免子类被迫实现无用逻辑

和接口混用时,抽象类优先提供状态和复用逻辑,接口负责能力契约

Java 8+ 允许接口有 default 方法,容易让人混淆该用哪个。简单判断:如果需要字段(private String token;)、构造器、或复杂初始化逻辑,必须用抽象类;如果只是声明“能做什么”(比如 ComparableRunnable),用接口更轻量、更利于多实现。

实际项目里常组合使用:一个抽象类实现核心状态与基础行为,再 implements 若干接口表达额外能力。比如 abstract class DatabaseConnector implements Closeable, AutoCloseable —— 状态和连接逻辑在抽象类里,关闭资源的契约由接口承担。

  • 抽象类只能单继承,接口可以多实现,设计时先想清楚“是不是真需要共享状态”
  • 抽象类中的 protected 字段或方法,对子类是可见的;接口里所有东西默认 public,没有访问控制余地
  • 如果未来可能让非继承关系的类具备相同能力,优先从接口开始设计
抽象类真正的难点不在语法,而在判断哪些逻辑该“锁死”,哪些该“留空”。很多人一开始就把太多方法设为 abstract,结果子类被迫实现一堆空壳;或者相反,把本该强制定制的环节写成具体方法,导致后续扩展只能靠复制粘贴。边界感得靠几次重构才能找准。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1071

2023.08.02

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

888

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

465

2024.06.27

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

513

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

384

2023.10.25

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6679

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

845

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1092

2023.12.21

minimax入口地址汇总
minimax入口地址汇总

本专题整合了minimax相关入口合集,阅读专题下面的文章了解更多详细地址。

3

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.5万人学习

C# 教程
C# 教程

共94课时 | 11.5万人学习

Java 教程
Java 教程

共578课时 | 83.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号