抽象类通过abstract方法建立规范契约,子类必须实现这些方法;abstract方法无方法体、只能在abstract类中定义,不能用private、static或final修饰,合法修饰符为public、protected或默认;配合模板方法模式可构建“骨架+钩子”结构。

在 Java 中,抽象类通过 abstract 方法 建立规范契约——子类必须实现这些方法,否则编译不通过。
用 abstract 修饰方法,不写方法体
抽象方法只有声明,没有实现(即无大括号和具体逻辑),必须用 abstract 关键字修饰,且只能定义在 abstract 类中:
abstract class Animal {
// 抽象方法:只声明,不实现
abstract void makeSound(); // ✅ 正确:无方法体,有 abstract 修饰
<pre class='brush:java;toolbar:false;'>// 普通方法:可选,子类可直接继承使用
void breathe() {
System.out.println("Breathing...");
}}
子类必须重写所有抽象方法(除非自身也声明为 abstract)
非抽象子类继承抽象类后,必须用 @Override 实现每个抽象方法;否则编译报错:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 正确:提供具体实现
- ❌ 错误:遗漏某个抽象方法
- ⚠️ 允许:子类也声明为 abstract,此时可延迟实现
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Woof!"); // ✅ 强制实现
}
}
抽象方法不能是 private、static 或 final
抽象方法的目的是被子类覆盖,因此语法上禁止与覆盖相冲突的修饰符:
- private → 子类不可见,无法重写
- static → 属于类,不参与多态,无法“强制子类实现”
- final → 禁止重写,与抽象目标矛盾
合法修饰符仅限:public、protected(默认包访问也可),通常推荐 public 以明确契约意图。
配合模板方法模式,组合抽象与具体行为
抽象类可同时定义抽象方法(由子类填充)和具体方法(统一逻辑),形成“骨架+钩子”结构:
abstract class DataProcessor {
// 模板方法:定义流程骨架(final 防止被重写)
final void process() {
loadData();
validate();
transform(); // 抽象方法:子类定制转换逻辑
save();
}
<pre class='brush:java;toolbar:false;'>abstract void transform(); // ✅ 强制子类实现差异化环节
void loadData() { /* 默认实现 */ }
void validate() { /* 默认实现 */ }
void save() { /* 默认实现 */ }}
这样既保证核心流程一致,又通过抽象方法约束关键扩展点。

















