抽象类是java中定义模板的半成品类,用abstract声明,不可实例化,需子类继承并实现所有抽象方法;它兼具具体方法、抽象方法和构造器,适用于有共同流程但关键步骤各异的场景。

抽象类在 Java 中不是用来直接干活的,而是为一组相关类搭骨架、定规矩、留接口。它把共用的功能写死(比如通用校验、日志记录、资源初始化),把变化的部分标成抽象方法(比如具体怎么查询、怎么计算、怎么渲染),让子类去填空。
抽象类必须用 abstract 声明,且不能 new
它不是“成品”,而是“半成品模板”。哪怕里面一个抽象方法都没有,只要加了 abstract 关键字,就不能直接实例化。想用,得靠子类继承后补全抽象方法,再 new 子类对象。
- 错误写法:
Animal a = new Animal();—— 编译不通过 - 正确写法:
Animal dog = new Dog();—— 通过子类间接使用
抽象类可以混合搭配:抽象方法 + 具体方法 + 构造器
它不像接口那样只管“能做什么”,而是兼顾“怎么做”和“谁来做”。比如定义一个数据处理器:
- 抽象方法:
protected abstract void fetchData();(子类决定从哪取数据) - 具体方法:
public final void execute() { fetchData(); validate(); save(); }(流程固定,不允许改) - 构造器:
public DataProcessor(String config) { this.config = config; }(供子类 super() 调用,初始化父类状态)
子类继承时,抽象方法必须实现,否则子类也得标 abstract
这是强制约定,不是可选项。如果子类没重写完所有抽象方法,编译器会报错,除非你主动把它也声明为抽象类——相当于“接力传递责任”,直到某个具体子类真正落地实现。
-
Dog继承Animal,就必须实现makeSound() - 若
RobotDog只实现了makeSound()却漏了move(),那它自己也得加 abstract
适用场景:有共同流程,但关键步骤因类型而异
当多个业务类共享大量逻辑(如统一鉴权、事务控制、结果封装),但核心动作各不相同(如支付方式有微信、支付宝、银行卡),抽象类就是最自然的选择。它比接口多一层状态管理能力,比普通父类多一层契约约束力。
- 模板方法模式:流程骨架固定,步骤由子类定制
- 框架基类:如 Spring 的
AbstractController提供基础响应处理 - 领域模型抽象:如
AbstractOrderProcessor封装订单生命周期共性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











