final类不能被继承,用于保障安全性、不可变性及性能优化。如String类防止篡改,不可变类确保状态固定,jvm可对final类方法内联优化,工具类通过final明确禁止扩展意图。

在Java中,final类是指不能被继承的类。一旦一个类被声明为final,其他类就不能 extends 它。这种设计主要用于限制类的扩展,确保类的行为不会被修改。以下是final类的几个典型应用场景:
1. 保证安全性:防止敏感类被篡改
某些类涉及系统安全或核心逻辑,不希望被继承后重写方法导致行为改变。
- java.lang.String 是最典型的例子。字符串在Java中是不可变的,如果允许继承string类,就可能通过子类破坏其不可变性,从而引发安全漏洞(例如在类加载、权限校验中使用字符串时)。
- 其他基本类型包装类如 Integer、double 等也被声明为final,防止被恶意继承和篡改行为。
2. 维护不可变性(Immutability)
不可变类通常设计为final,以确保其状态一旦创建就不能被修改,也不会被子类破坏。
- 自定义不可变类时,将类声明为final可以防止子类添加可变字段或重写方法来改变状态。
- 例如,你设计一个表示“日期区间”的类,要求一旦创建就不能更改起止时间,将其设为final能更好地保障这一特性。
3. 提高性能:便于JVM优化
final类的方法默认也是final的(不能被重写),这使得JVM在运行时可以直接内联方法调用,减少动态分派的开销。
立即学习“Java免费学习笔记(深入)”;
- JVM知道final类的方法不会被覆盖,因此可以更激进地进行编译优化。
- 在高频调用的工具类或核心类中使用final,有助于提升程序执行效率。
4. 工具类和常量类的设计
一些只包含静态方法和常量的类,不需要也不应该被实例化或继承。
- 虽然这类类通常通过私有构造函数防止实例化,但加上final关键字可进一步明确“不可扩展”的意图。
- 例如,自定义的 MathUtils 或 ConfigConstants 类,声明为final可以防止误继承。
基本上就这些。final类的核心价值在于控制继承、保障安全、维护设计契约。在设计API或核心模块时,如果某个类不应该被扩展,就应果断使用final修饰。这样做不仅提升了代码的健壮性,也向其他开发者清晰传达了设计意图。


