final修饰类可彻底防止继承,编译期报错;语法为public final class classname{};该类不可被extends,但可实例化、组合、实现接口,其非private方法自动具有final语义。

在 Java 中,用 final 修饰类是最直接、最彻底的防止继承方式——编译器会在子类声明时立即报错,不给任何运行机会。
怎么写:语法很简单
在 class 关键字前加上 final 即可:
public final class StringUtils {
// 工具方法
}
此时任何尝试继承它的代码都会编译失败:
class MyUtils extends StringUtils { } // 编译错误:Cannot inherit from final 'StringUtils'
关键效果:不只是“不能继承”,还有连带影响
- 该类无法被
extends,但可以正常实例化、调用方法、被其他类组合(has-a) - 类中所有非
private的实例方法自动具有final语义(即使没显式写final),子类无法重写它们 - 构造器本身不能加
final(语法不允许),也不需要——构造器本来就不参与继承 - 不影响实现接口(
implements),只约束类层级的继承关系
什么时候该用:不是为了“锁死一切”,而是有明确设计意图
- 工具类(如
String、Integer、Math)——行为必须稳定,不可变性依赖类不可扩展 - 安全敏感类(如加密处理器、凭证校验器)——防止子类绕过核心逻辑
- 已完成封装的业务实体(如
OrderId、Money)——值对象一旦定义,就不该被继承篡改语义
注意一个常见误解
final 是编译期强制约束,它不会“断开已存在的继承链”。如果已有类 A 继承了 B,之后把 B 改成 final,那么 A 的源码会编译失败——不是 A 被“断开”,而是整个继承声明本身变得非法。已经加载进 JVM 的类不受 retroactive 影响,但那种情况属于违反语言规范,JVM 可能拒绝或抛出 IncompatibleClassChangeError。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











