普通方法在子类中不强制重写,抽象方法则必须实现;前者提供默认行为,后者定义契约;抽象类通过二者结合实现灵活性与规范性的统一。

普通方法在子类中不强制重写,抽象方法在子类中强制实现——这是最核心的区别。
普通方法:可选继承,不强制覆盖
普通方法已有具体实现,子类自动继承,直接可用。是否重写完全由子类决定:
- 不重写,就沿用父类逻辑
- 重写(加 @Override),是为了定制行为,编译器不检查、不干预
- 即使子类是具体类(非 abstract),漏掉重写也不会报错
抽象方法:编译期硬性约束,绕不开
抽象方法没有实现,只划出“必须提供什么能力”的契约。子类一旦不是 abstract 类,就必须全部实现:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 少实现一个,编译直接失败,提示:class X must either be declared abstract or implement abstract method Y in Z
- 不能用 private、static、final 修饰,否则语义冲突(无法被子类继承或重写)
- 访问权限不能比父类更严格(如父类 public,子类不能写 protected)
抽象类里混用两种方法,分工明确
抽象类常把稳定逻辑放进普通方法(比如日志、参数校验、事务模板),把变化点抽成抽象方法(比如 validate()、doProcess()):
立即学习“Java免费学习笔记(深入)”;
- 普通方法统一维护,子类少出错
- 抽象方法强制填空,确保关键行为不遗漏
- 二者配合,既保灵活性,又守规范底线
子类声明为 abstract 是合法的“暂缓执行”方式
如果子类暂时不想或不能完成全部抽象方法,可以主动声明为 abstract:
- 这样就不受“必须实现”的编译限制
- 但责任会继续下传——它的子类仍需面对同样约束
- 适合做中间层抽象,比如 AbstractService → UserService

















