用final修饰类是最直接彻底的防继承方式,编译器在子类声明时即报错;语法为public final class ClassName{},不可修饰抽象类,修饰后无法被继承、方法自动final、仍可实例化与组合。

用 final 修饰类是最直接、最彻底的防止继承方式——编译器会在子类声明那一刻就报错,不给任何运行机会。
怎么写:语法很简单
在 class 关键字前加上 final 即可:
public final class StringUtils { ... }final class ConfigLoader { ... }- 注意:
final不能修饰抽象类(abstract 和 final 语义冲突)
修饰后会发生什么
被 final 修饰的类具备以下确定行为:
- 其他类无法用
extends继承它,编译直接失败,提示类似Cannot inherit from final 'StringUtils' - 该类仍可正常实例化、调用方法、被组合(has-a)、被引用——只是不能被 extends
- 类中所有非 private 方法自动成为 final(无需额外加 final),因为没有子类,自然无法重写
- 构造方法不能也不需要加 final(构造器本身不参与继承和重写)
适合加 final 的典型场景
不是所有类都该 final,而是当设计意图明确“不允许扩展”时才用:
- 核心不可变类:如
String、Integer,防止子类破坏其不可变性与安全性 - 工具类:如
Math、Objects,只提供静态方法,无状态、无继承必要 - 配置或常量载体类:内部全是
public static final字段,行为固定 - 第三方 SDK 中的关键入口类:避免用户通过继承绕过控制逻辑
一个常见误区
有人以为把父类改成 final 就能“断开已存在的继承链”,其实不是:
- 如果已有
class A extends B,此时把B改成 final,会导致A编译失败 - 这不是“断开”,而是让整个继承关系在编译期失效——项目将无法通过编译
- final 是面向未来的约束,不影响已加载或已编译的合法子类
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











