Record 类天生不可被继承,这是 Java 编译器强制的语义约束,自动生成 final 修饰,禁止 extends、禁止实例字段和普通构造器,仅支持组合与接口实现等替代方案。

Record 类天生就不能被继承,这不是靠你写 final 关键字实现的,而是 Java 编译器在底层强制规定的语义约束。
编译器自动加 final 修饰,无需手动声明
你定义一个 record,比如:
record Person(String name, int age) {}编译器生成的字节码中,这个类本身就是 final class Person。哪怕你没打一个 final,它也绝不可能被 extends。试图写 class Student extends Person 会直接编译失败。
不支持继承是设计目标,不是限制缺陷
- Record 的核心定位是“不可变数据载体”,继承会破坏这个前提——子类可能添加可变字段、重写 accessor、绕过 compact constructor 校验
- Java 明确禁止 record 声明实例初始化块、普通字段、非 private 静态字段(除静态常量和方法外),所有这些限制都服务于“结构封闭 + 状态固化”这一原则
- 它和 sealed class 不同:sealed 允许你列明哪些类能继承;record 则彻底关闭继承通道,连
permits都不给你写的机会
和普通 final 类的区别在哪
普通类加 final 是防止继承,但还能有 static 成员、内部类、自定义逻辑;record 的 final 更彻底:
- 不能有普通构造器(只有规范构造器 canonical 和可选的 compact 构造器)
- 不能有实例字段(除了组件声明的那些,且它们自动是
private final) - 不能有实例初始化块、不能重写
equals/hashCode/toString(除非显式提供,但需谨慎)
如果真需要扩展行为,替代方案是什么
Record 不支持继承,但支持组合与接口实现:
- 让其他类持有 record 实例作为字段(推荐)
- 让 record 实现某个接口,用多态统一处理不同 record 类型
- 用 record 作为密封类(sealed class)的允许子类之一——前提是父类在
permits中明确列出它

















