抽象方法通过编译期强制约束子类实现规范,必须定义在抽象类中且无方法体,子类须全部实现或声明为abstract;结合模板方法可控制流程与扩展点。

Java 抽象方法通过编译期语法约束强制子类实现特定规范,不是靠约定或运行时检查,而是写完代码就由编译器直接拦截不合规的子类——只要规则用对,子类想绕过去都不行。
抽象方法必须定义在抽象类中
抽象方法不能独立存在,也不能放在普通类里。否则编译器会报错:abstract method in non-abstract class。
- 正确写法:类和方法都加 abstract 修饰
- 错误写法:普通类里声明 abstract 方法,或抽象类里漏掉 abstract 修饰符
- 抽象类本身可以没有抽象方法(仅靠 abstract 关键字即可),但要起约束作用,通常需搭配至少一个抽象方法
抽象方法本身不能有实现
它只声明“做什么”,不写“怎么做”。连空花括号 {} 都不允许,否则编译失败。
- ✅ public abstract void start();
- ❌ public abstract void stop() {}(带方法体)
- ❌ private abstract void init();(private 不可继承)
- ❌ final abstract void reset();(final 和 abstract 语义冲突)
子类要么全部实现,要么自己也声明为 abstract
这是强制落地的关键环节。编译器会逐个检查继承链上所有未实现的抽象方法。
立即学习“Java免费学习笔记(深入)”;
- 具体子类(没加 abstract)必须用 @Override 实现父类所有抽象方法
- 漏掉任何一个,编译报错:must either be declared abstract or implement abstract method
- 如果子类不想实现,可以声明为 abstract class Sub extends Parent,把责任往下推
- 重写时访问权限不能比父类更严格(如父类是 public,子类不能写 protected)
结合模板方法让规范真正落地
光有抽象方法只能卡住“有没有实现”,配合模板方法才能控制“怎么调、何时做、前后做什么”。
- 在抽象类中定义 final 方法封装流程骨架(如 process())
- 把关键变化点设为 protected abstract 方法(如 validate()、save())
- 子类无法修改执行顺序,但必须填空;公共逻辑(日志、事务、异常包装)由父类统一处理
- 避免在抽象类构造器中调用抽象方法——子类字段尚未初始化,极易引发空指针


















