final类无法被继承,这是Java中实现不可变性和封装性的重要手段,它从语言层面强制阻止子类扩展,确保类的定义和行为完全受控,常用于工具类、安全敏感类或已高度优化的核心类。

final类无法被继承,这是Java中实现不可变性和封装性的重要手段。 它从语言层面强制阻止子类扩展,确保类的定义和行为完全受控,常用于工具类、安全敏感类或已高度优化的核心类。
final类的核心限制:禁止继承
一旦用final修饰一个类,任何其他类都不能使用extends关键字继承它。编译器会在编译期直接报错,而非运行时。
- 例如:
final class StringUtils { ... },则class MyUtils extends StringUtils会编译失败 - 接口实现不受影响——final类仍可implements接口,只是不能被继承
- 类中的方法自动成为final(无需显式加final),但已有final方法不因此重复生效
为什么设计final类:安全性与稳定性优先
将类声明为final,本质是明确表达“这个类的设计已完成,不希望也不允许被修改或重写”。常见适用场景包括:
- 字符串类(如
java.lang.String):防止通过继承篡改不可变语义 - 基本包装类(如
Integer、Boolean):避免子类破坏值对象契约 - 工具类(如
Objects、Collections):无状态、纯静态方法,无继承必要 - 涉及安全校验或加密逻辑的类:防止子类绕过关键检查
final类 ≠ 不可变类,但常配合使用
final修饰的是继承关系,而“不可变”(immutable)指实例创建后状态不可更改。二者相关但不等价:
立即学习“Java免费学习笔记(深入)”;
- final类可以有可变字段(如非private非final的成员变量),仍可能被修改
- 真正的不可变类需同时满足:类为final、所有字段private且final、不提供修改状态的方法、构造器充分防御(如深拷贝可变参数)
- 所以
String既是final类,又通过私有final字段+无修改方法+构造防御实现了不可变
使用建议与注意事项
是否将类设为final,应基于设计意图权衡,而非盲目套用:
- 若类未设计为被继承(没有protected成员、无模板方法、文档未承诺可扩展),建议加final,避免未来误用
- 框架或库作者应谨慎使用final——除非有强理由,否则可能限制用户合理定制
- 单元测试中,final类无法被Mockito等默认mock工具直接mock(需启用ByteBuddy或使用@Mocked注解)
- 反序列化不受影响:final类仍可被ObjectInputStream正常还原(只要满足序列化规范)










