final类无法被继承,编译时即报错;正确写法为public final class或final class;适用于不可变值对象、安全敏感类和纯工具类。

直接在 class 关键字前加上 final,就能让这个类彻底无法被继承——编译器会在子类声明时立刻报错,不给任何运行机会。
写法很简单,但位置不能错
必须把 final 放在访问修饰符(如 public)之后、class 之前:
- ✅ 正确:
public final class Config { }或final class StringUtils { } - ❌ 错误:
class final Utils { }(语法不合法) - ❌ 错误:
public class final PaymentService { }(位置错,编译失败)
加了 final 之后会发生什么
一旦类被声明为 final,所有继承尝试都会在编译阶段被拦截:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
class MyConfig extends Config { }→ 编译报错:Cannot inherit from final 'Config' - IDE(如 IntelliJ)会实时标红,并提示“Class is final”
- JVM 字节码中会带上
ACC_FINAL标志,类加载器拒绝加载任何试图继承它的子类
哪些类适合加 final
不是所有类都要加,但以下三类强烈建议尽早设为 final:
-
不可变值对象:如
Money、OrderId、LocalDateTime——防止子类通过重写equals或toString破坏语义一致性 -
安全敏感类:如
TokenValidator、SignatureVerifier——避免恶意子类绕过核心校验逻辑 -
纯工具类:如
JsonUtils、CryptoHelper——只提供静态方法,加final能阻止他人意外继承并添加实例方法,污染命名空间
几个关键细节别忽略
final 类的设计需配合其他规范才真正安全:
- 构造器不要用
protected——final 类不可能被继承,protected构造器反而可能被同包类误用;推荐用private或包私有 - 不用给方法再加
final——final 类中的实例方法天然不可重写,显式加final是语法错误 - 不能和
abstract共用——语义矛盾,编译直接拒绝 - 文档或注释“禁止继承”没用——只有
final才是编译器强制约束,反射也无法绕过
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










