final修饰的类在编译期彻底阻止继承,任何extends语句都会导致javac报错且无法生成字节码;它适用于不可变值对象、安全敏感类和纯工具类,但需确认无现存子类且团队共识封闭设计。

Java 中用 final 修饰类,就能在编译期彻底阻止被继承——不是靠约定、不是靠文档,而是让继承语句直接报错,连 class 文件都生成不了。
final 修饰类:编译阶段就拒绝 extends
只要在 class 关键字前加上 final,这个类就成为“终点类”:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 任何写
class Sub extends FinalClass的代码,javac 立即报错:Cannot inherit from final 'FinalClass' - JVM 不会为这种继承关系生成字节码,虚方法表(vtable)里也根本不会出现继承链
- 该类仍可被实例化、被组合(has-a)、被接口实现(implements),只是不能被
extends
哪些类适合加 final?
核心原则是:设计已封闭、行为必须稳定、不允许被扩展或篡改。
-
不可变值对象:如
String、LocalDateTime、BigInteger—— 防止子类破坏不可变性 -
安全敏感类:如
SecretKey、AccessControlContext—— 避免恶意继承绕过校验 -
纯工具类:如只含静态方法的
Objects、Arrays—— 防止被意外继承污染命名空间
常见误区提醒
- final 类中的方法自动不可重写,无需再给每个方法加 final(显式加可作语义强调,但非必需)
- 不要给抽象类加 final —— 语法虽可能通过,但逻辑矛盾:抽象类本意就是被继承
- private 构造器 ≠ final:它只能阻止实例化,不阻止继承(除非配合其他手段)
- sealed 类(Java 17+)不是替代方案:它控制“谁能继承”,而 final 是“谁都不能继承”
加 final 前务必确认
- 项目中没有现存子类,否则一加就编译失败,影响依赖方
- 团队已达成共识:该类确实不再需要扩展,未来也不打算开放继承点
- IDE(如 IntelliJ)可开启 “Inheritance can be prohibited” 检查,辅助识别适合加 final 的类

















