用 final 修饰类可从编译层面彻底阻止继承,如 final class utils{};任何 extends 尝试均在编译时报错,因其是编译器强制契约,非运行时检查,适用于不可变类、工具类、安全敏感类和值对象。

在 Java 中,用 final 修饰一个类,就能从编译层面彻底阻止它被继承——不是运行时拦截,而是连代码都写不下去,一写 extends 就报错。
直接在 class 前加 final
语法最简单:在类声明前加上 final 关键字即可。
final class Utils { }public final class Config { }-
final record Point(int x, int y) { }(record 类本身隐含 final,显式加也合法)
一旦这样定义,任何子类尝试继承都会在编译时报错,例如:
class MyUtils extends Utils { } → 编译错误:"Cannot inherit from final 'Utils'"
为什么能“防止被继承”?
final 是编译器强制执行的契约,不是靠 JVM 运行时检查。
- 它让
extends关系在语法解析阶段就被拒绝 - 子类源码甚至无法通过编译,更不会生成 .class 文件
- 已存在的继承关系不受影响,但若把父类临时改成 final,所有已有子类会立刻编译失败
哪些类适合加 final?
核心原则是:**这个类的设计已经封闭,不允许行为被扩展或篡改。**
- 不可变类(如
String、Integer)——防止子类破坏不可变性 - 工具类(如
Objects、Collections工具方法封装类)——避免被继承后意外重写逻辑 - 安全敏感类(如加密上下文、凭证持有者)——杜绝通过继承注入恶意行为
- 值对象(DTO、Record)——语义上就是“数据容器”,无扩展必要
常见误区提醒
final 类 ≠ 不能用,只是不能被继承。
- final 类可以正常实例化、调用方法、被其他类组合(has-a)、实现接口
- final 类中的方法自动具有 final 语义(无法被重写),无需再给每个方法加 final
- 构造方法不能用 final 修饰(语法错误,构造器本就不参与继承)
- 内部类、静态嵌套类、泛型参数等都不受 final 类限制,照常使用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











