final对类和方法的限制是编译期强制约束:final类不可继承,其方法自动隐式final;final方法可继承但不可重写;二者均不参与运行时防护,旨在从源头杜绝非法修改。

Java 中 final 关键字对类和方法的限制,本质是编译期强制约束,不是运行时防护。它不靠“拦截”或“断开”,而是让非法操作在写代码时就报错,从源头杜绝修改可能。
final 修饰类:彻底封死继承入口
在 class 前加 final,该类就无法被任何其他类继承。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 写法示例:
public final class StringUtils { ... } - 一旦尝试
class MyUtils extends StringUtils,编译器立刻报错:Cannot inherit from final 'StringUtils' - 常见用途:不可变类(如
String、LocalDateTime)、工具类(如Math)、安全敏感类(如加密配置加载器)——这些类的设计初衷就是“只用,不扩” - 注意:final 类仍可正常实例化、调用其 public 方法;其所有普通方法自动隐式为 final(无需再单独加 final);但构造器不能被 final 修饰
final 修饰方法:允许继承,但锁死重写逻辑
在方法返回类型前加 final,子类可以继承并调用该方法,但不能用 @Override 改写其实现。
- 写法示例:
public final String getId() { return id; } - 子类中写
@Override public void getId() { ... }会直接编译失败 - 典型场景:父类中已固化的核心逻辑,比如权限校验、资源释放、模板流程中的固定步骤、已优化的关键算法
- 注意:final 方法仍可被重载(overload),只要参数列表不同即可;private 或 static 方法本身不参与重写机制,加 final 属于冗余,无实际效果
关键设计原则与常见误区
final 不是“为了禁止而禁止”,而是服务于明确的设计意图。
- 不要滥用:不是所有工具类都必须 final,若未来有合理扩展需求,强行加 final 反而阻碍演进
- 不能和 abstract 共存:抽象类的意义是被继承,final 类的意义是禁止继承,二者语义冲突
- 不影响已有继承关系:如果 A 类已经继承了 B 类,此时把 B 改为 final,不会“断开”A,而是让整个项目编译失败
- 替代方案更灵活:若想控制“谁可以继承”,Java 17+ 的 sealed 类比 final 更精准;若想保留扩展又保护关键步骤,可用模板方法模式
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










