抽象类是专为继承设计的模板类,用abstract声明、不可实例化,通过约束抽象方法和提供公共逻辑实现模板方法模式。

Java 中的抽象类不是“不能用的类”,而是专为继承而设计的模板类——它用 abstract 修饰,不提供完整实现,但能统一子类结构、约束关键行为、复用公共逻辑。
抽象类必须用 abstract 显式声明,且不可实例化
哪怕类里所有方法都有具体实现,只要加了 abstract 修饰符,就不能用 new 创建对象。JVM 会在运行时抛出 InstantiationError。这不是语法错误,而是设计契约:抽象类只负责定义“谁该做什么”,不负责“自己怎么做”。
- 子类通过
extends继承抽象类,是唯一合法使用方式 - 抽象类可以有构造器——供子类
super()调用,初始化父类字段或执行通用前置逻辑 - 一个类只要含至少一个
abstract方法,就必须声明为abstract class;反过来,abstract类可以没有抽象方法(但通常意义不大)
抽象方法必须满足三不原则:无体、非私、非常量
抽象方法是纯契约声明,只规定签名,不提供实现。它的存在是为了让子类“必须回应”。
- 不能有方法体:写成
abstract void run();✅,写成abstract void run() { }❌ 编译失败 - 不能是
private:子类根本无法访问,违背“强制实现”初衷 - 不能是
static:静态方法属于类本身,无法被重写,与抽象语义冲突 - 访问权限默认包内可见,但显式写
public或protected更清晰、更安全
子类要么全实现,要么继续抽象
继承抽象类后,子类面临明确选择:立刻兑现契约,或把责任往后推。
- 如果子类是普通类(非
abstract),必须重写父类所有未实现的抽象方法,否则编译报错,提示类似does not override abstract method xxx - 如果子类也声明为
abstract,可选择性实现部分抽象方法,把剩余契约留给下一级子类 - 最终链条上必须有具体子类完成全部抽象方法,否则整条继承链都无法实例化
抽象类的核心价值在于模板方法模式
它不只是“强制写方法”的工具,更是封装固定流程 + 开放可变环节的理想载体。
- 把不变逻辑(如日志、校验、资源释放)写在
final或普通方法中 - 把变化点(如数据获取、格式转换)定义为
abstract方法,交由子类定制 - 例如:
exportReport()是final流程方法,内部调用fetchData()和format()这两个抽象方法——接口做不到这点,普通类又无法强制子类实现关键步骤
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











