java中抽象类通过继承确立“is-a”类型关系,用abstract强制子类实现关键方法以履行行为契约;含abstract方法的类必须声明为abstract,非抽象子类须全部实现,且方法签名与访问权限需严格匹配;抽象类可含具体方法、字段和构造器以复用共性逻辑,并支持模板方法模式固化流程、开放可变环节。

Java 中继承结合 abstract 抽象类规范子类行为,关键在于用继承关系承载“is-a”语义,再通过 abstract 机制在编译期强制子类补齐关键能力,同时复用父类已有的稳定逻辑。
继承确立类型关系,abstract 划定实现边界
子类用 extends 继承抽象类,就表明它属于该抽象类型的一种具体实现。这种继承不是为了代码复用而存在,而是为了承诺具备该类型所定义的行为契约。
- 抽象类不能 new,但可以声明变量:如 Animal a = new Dog();,运行时调用的是 Dog 的实际实现
- 只要抽象类中有一个 abstract 方法,整个类就必须用 abstract class 声明
- 非抽象子类继承后,若未实现全部抽象方法,编译器直接报错,不等到运行时
抽象方法强制子类提供差异化逻辑
抽象方法是子类不可绕过的“必答题”,它只规定“做什么”和“怎么调”,不关心“怎么做”。这保证了所有子类在关键行为上具备统一接口。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 例如 abstract double calculatePrice(); 要求每个商品子类(Book、Electronics)都给出自己的定价逻辑
- 方法签名必须严格一致:返回类型、名称、参数列表不能变;访问修饰符不能比父类更严格(public 抽象方法,子类重写也得是 public)
- 不能用 private、static、final 修饰抽象方法——它们与“留给子类覆盖”的设计目标冲突
具体方法和构造器支撑共性逻辑与初始化
抽象类不是空壳,它可以包含完整实现的方法、字段、构造器,让子类少写重复代码,又能保障基础状态一致。
- 公共校验、日志记录、资源初始化等通用操作,可封装为普通方法,子类直接继承调用
- 抽象类的构造器虽不能直接 new,但子类可通过 super(...) 调用,完成父类字段赋值或预处理
- 比如定义 protected final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");,所有子类共享格式化工具
模板方法模式把流程控制权交给父类
这是抽象类发挥规范作用的高阶用法:用 final 方法固化执行顺序,把可变环节抽成 abstract 方法,让子类只专注差异点。
- 例如 final void processOrder() { validate(); reserveStock(); charge(); sendConfirmation(); }
- 其中 validate() 和 charge() 是 abstract 方法,由子类各自实现;其余步骤由父类统一管控
- 子类无法修改流程顺序或跳过某个环节,既保障核心逻辑稳定,又保留业务定制空间
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










