final关键字在Java中用于实现不可变性和继承封锁:修饰类时禁止继承,修饰方法时禁止重写;其核心是切断继承链扩展能力,保障安全性与完整性。

final 关键字在 Java 中用于表达“不可变”或“不可覆盖”的语义。当它修饰类或方法时,核心作用是**切断继承链中的扩展能力**,从而实现对继承权限的最终封锁。
final 修饰类:禁止被继承
用 final 修饰一个类,意味着该类不能作为父类被其他类继承。JVM 在编译期就拒绝任何 extends 该类的声明。
- 常见例子:Java 标准库中的 String、Integer、System 都是 final 类
- 一旦声明为 final,连空继承(class Sub extends FinalClass{})都会报编译错误
- 设计意图通常是保障类的完整性与安全性,防止子类篡改其行为或破坏不可变性
final 修饰方法:禁止被重写
用 final 修饰一个方法,表示该方法可以被继承,但**不允许在子类中被重写(override)**。这锁定了方法的具体实现逻辑。
- 即使子类继承了该方法,也无法用 @Override 重新定义它的行为
- 常用于模板方法模式中的骨架方法,或关键安全逻辑(如 Object.clone() 在某些封装类中被设为 final)
- 注意:final 方法仍可被正常调用,也不影响重载(overload)
与 private、static 方法的继承关系辨析
不是所有不能被重写的方法都靠 final 封锁:
- private 方法天生不可见,子类根本无法访问,更谈不上重写——这不是“封锁”,而是“不可达”
- static 方法属于类而非实例,虽能被继承,但实际是“隐藏”(hiding)而非重写;加 final 只是进一步禁止子类定义同名 static 方法
- 只有 非 private、非 static 的实例方法,才真正需要 final 来主动阻断重写可能性
不建议滥用 final,但关键处必须用
过度使用 final 会降低代码的可测试性与可扩展性(比如难以 Mock final 类或方法)。但以下场景应果断使用:
- 明确设计为不可变的数据载体(如值对象、DTO)
- 封装了敏感操作或核心算法,不容许语义被意外改变
- 性能敏感路径中,JVM 可对 final 方法做内联优化(虽非主要目的,但属额外收益)









