抽象类在Java中不可实例化,专用于被继承,核心作用是实现代码复用与强制子类遵循行为规范;它可含具体方法、抽象方法、字段及构造器,支持模板方法模式和有状态的类层次建模,且必须通过子类继承并实现全部抽象方法(除非子类也声明为抽象类)。

抽象类在Java中不是用来创建对象的,而是作为子类的模板和规范载体。设计时要明确“哪些逻辑共用、哪些行为必须由子类决定”,使用时关键在于继承与实现的配合。
设计抽象类的核心原则
抽象类应体现“部分实现 + 强制约定”的平衡:
- 只封装真正共有的状态和行为:比如所有图形都有颜色、所有动物都有呼吸动作,这些可写成具体方法或字段
-
把差异点声明为抽象方法:如
area()、shout()等无法统一实现的行为,用abstract修饰,不写方法体 -
允许定义构造器:用于初始化父类字段(如
Shape(String color)),子类通过super()调用 - 不要为了抽象而抽象:没有抽象方法的类也可以是抽象类(比如只为禁止实例化),但要有明确设计意图
使用抽象类的硬性规则
Java编译器会强制执行以下限制,违反即报错:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
不能直接
new抽象类对象,例如new Animal()会编译失败 -
含抽象方法的类必须用
abstract修饰,否则编译不通过 - 非抽象子类继承抽象类时,必须重写全部抽象方法,少一个都不行
-
抽象方法不能是
private、static或final,否则语义冲突
典型应用场景与写法
抽象类适合解决有状态、有流程、需复用又需定制的问题:
立即学习“Java免费学习笔记(深入)”;
-
模板方法模式:在抽象类中定义算法骨架(如
process()),调用几个protected abstract步骤,子类只实现关键环节 -
共享字段与构造逻辑:接口不能存实例变量,而抽象类可以声明
protected String name并提供带参构造器 -
分层建模:如
Vehicle(抽象)→Car、Bike(具体),既表达“is-a”关系,又避免上层概念被误实例化
和接口的关键区别提醒
别混淆抽象类和接口,它们定位不同:
- 抽象类强调“是什么”,支持字段、构造器、部分实现;接口强调“能做什么”,纯行为契约(即使Java 8+支持default方法,本质仍无状态)
- 一个类只能
extends一个抽象类,但可implements多个接口——这是Java单继承机制下的互补设计 - 当需要共享代码或状态时选抽象类;当需要多维度能力组合(如
Runnable+Serializable)时选接口


















