final修饰类时禁止继承,修饰方法时禁止重写,二者均为编译期强制约束;final类中所有非private方法自动不可重写,但字段仍可读写,除非显式声明为final。

在 Java 继承体系中,final 是最直接、最明确的语法手段,用于表达“不可继承”和“不可重写”的设计意图。它不是运行时限制,而是在编译期强制约束,让错误提前暴露。
用 final 修饰类:彻底阻止继承
只要在 class 关键字前加上 final,该类就无法被任何类继承。编译器会直接拒绝 class Sub extends FinalClass 这样的语句。
- 写法示例:
public final class Config { ... }或final class StringUtils { ... } - 一旦类是 final 的,它所有非 private 方法都自动具备“不可重写”特性(即使没显式加 final),但字段仍可读写,除非它们自己也被声明为 final
- 典型应用:Java 标准库中的
String、LocalDateTime、Math等——这些类行为必须稳定,不容许通过继承篡改
用 final 修饰方法:允许继承,但禁止重写
把 final 放在方法返回类型之前,表示这个方法可以被子类继承并调用,但不能被覆盖(override)。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 写法示例:
public final void save() { ... }、protected final boolean isValid() { ... } - 注意:private 方法本身不可继承,加 final 没意义;构造器不能用 final 修饰
- final 方法仍支持重载(overload),只要参数列表不同即可,它只限制语义相同的重写
- 常见场景:模板方法模式中的骨架流程(如
execute()),或含安全校验、线程同步的关键逻辑
在抽象类中混合使用 final 和 abstract
抽象类可以同时包含 final 方法和 abstract 方法,二者不冲突,反而是良好设计的体现。
- abstract 方法定义扩展点,final 方法锁定不可变逻辑,比如:
public final void run() { init(); doWork(); cleanup(); },其中doWork()是 abstract 的 - 不允许给 abstract 方法加 final——语义矛盾,编译直接报错
- 避免在 final 方法内部调用可被重写的方法,否则可能引发意外的多态行为
实际使用建议
final 的本质是契约表达,不是防御性编码。是否使用,应基于设计合理性,而非“怕别人乱改”。
- 值对象(如
Point、Money)、工具类(如Objects、Collections)、安全敏感类,适合设为 final - 已有类加 final 前,需确认没有现存子类,否则会破坏编译,影响依赖方
- 过度使用 final 可能降低可测试性(如难以 mock)或未来扩展灵活性,需权衡
- IDE(如 IntelliJ)提供 inspection 支持,能自动识别潜在继承链,推荐开启相关检查
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










