抽象类用abstract声明,不能实例化,可含抽象方法(无实现)和具体方法(可复用),强制子类实现抽象方法,支持模板方法模式,并可与接口结合实现is-a关系与can-do能力的协同。

抽象类通过 abstract 关键字声明,核心作用是定义通用结构和行为模板,强制子类实现关键逻辑,同时允许复用共性代码。
用 abstract 声明抽象类和抽象方法
抽象类不能被实例化,必须用 abstract 修饰;其中可包含抽象方法(无方法体,以分号结尾)和具体方法(有实现):
- 抽象方法只声明签名,不写大括号,必须由非抽象子类 重写实现
- 抽象类中可以有构造器、字段、静态方法、普通方法——这些都可被子类继承或直接调用
- 一个类只要含有至少一个抽象方法,它本身就必须声明为
abstract
抽象类作为模板:规定“做什么”,不约束“怎么做”
比如设计一个通用的消息处理器:
abstract class MessageHandler {
// 模板方法:定义执行流程(不可重写)
final void handle(String input) {
validate(input);
String processed = process(input); // 交给子类实现
log(processed);
}
// 具体方法:所有子类共用
private void validate(String s) {
if (s == null || s.trim().isEmpty()) {
throw new IllegalArgumentException("Input cannot be empty");
}
}
private void log(String s) {
System.out.println("[LOG] " + s);
}
// 抽象方法:子类必须提供具体处理逻辑
abstract String process(String input);
}
这里 handle() 是固定流程(模板方法模式),process() 是待填充的“空缺”,构成清晰的扩展点。
子类继承时的关键规则
子类继承抽象类后,需满足以下任一条件,否则自身也必须声明为 abstract:
- 实现父类所有抽象方法(方法名、参数、返回类型严格一致)
- 不实现部分抽象方法,但明确放弃实例化能力,继续作为抽象层存在
例如:class SmsHandler extends MessageHandler { public String process(String s) { return "SMS: " + s; } } —— 此时可创建 new SmsHandler() 实例。
与接口的配合使用更灵活
抽象类适合表达“is-a”关系并共享状态/行为;接口适合定义“can-do”能力。两者可结合:
- 抽象类实现部分接口,留出其他方法让子类完成
- 子类可同时
extends一个抽象类 +implements多个接口,兼顾复用与解耦
例如:抽象类 Animal 定义 breath() 和 move(),再让子类实现 Flyable 或 Swimmable 接口,自然体现不同动物的能力差异。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











