使用 final 修饰类可禁止继承,语法为 final class classname { ... };其方法天然不可重写,字段可变性取决于自身修饰符;常用于工具类、包装类等需保证契约稳定的场景。

在 Java 中,使用 final 关键字修饰一个类,就能禁止该类被其他类继承。
直接在 class 前加 final
这是最简单直接的方式。只要在定义类时,在 class 关键字前加上 final,这个类就无法被继承。
- 语法格式:final class ClassName { ... }
- 编译器会拒绝任何 extends ClassName 的子类定义,编译时报错
- 例如:
final class Utils {
public static void log(String msg) { System.out.println(msg); }
}
此时写 class MyUtils extends Utils 会编译失败
final 类中的方法和字段自动具有隐含约束
final 类本身不可被继承,因此它的所有方法天然无法被重写(相当于每个方法都隐式是 final 的),但字段是否可变仍取决于其自身修饰符。
- final 类中可以定义非 final 方法,但子类不存在,所以“重写”无从谈起
- 字段是否可变与类是否 final 无关:普通字段仍可修改,只有用 final 修饰的字段才不可重新赋值
- 常见组合:用 public static final 定义常量,配合 final 类实现工具类的不可扩展性
典型使用场景
final 类多用于设计上不希望被定制或误用的核心工具类、包装类或安全敏感类。
- Java 标准库中的 String、Integer、System 等都是 final 类
- 自定义的通用工具类(如 JSON 工具、加密工具)适合声明为 final,避免子类破坏单例或线程安全性
- 领域模型中明确不允许扩展的实体(如固定格式的响应码枚举包装类)也可用 final 保证契约稳定
注意:final 类 ≠ 不可实例化
final 只限制继承,不影响实例化。只要类有可访问的构造方法,仍然可以 new 出对象。
- final 类可以有 public 构造方法,也能被正常创建实例
- 如果想同时禁止实例化,需将构造方法设为 private,并提供静态工厂方法(如 Collections 工具类)
- 例如:final class EmptyHolder { private EmptyHolder() {} public static EmptyHolder of() { return new EmptyHolder(); } }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











