final修饰类可禁止继承,如string;修饰方法可禁止重写,但允许调用;它表达设计意图而非限制编码,需按需使用而非滥用。

用 final 修饰类或方法,是 Java 中实现“不可变设计”和“安全封装”的基础手段。它的核心作用不是“阻止别人写代码”,而是明确表达设计意图:这个类不该被扩展,这个方法的行为必须固定。
用 final 修饰类:彻底禁止继承
在 class 关键字前加 final,该类就无法被任何其他类继承。编译器会直接报错,连子类定义都通不过。
- 语法很简单:
final class MyClass { ... } - 一旦声明为 final,所有成员(包括构造器)都隐式“不可覆盖”,但普通字段和方法仍可访问(除非它们自己也被 private 或 final 限制)
- 典型例子:
java.lang.String、Integer、Math都是 final 类——这是为了保证字符串不可变、数值包装类行为稳定、数学工具类不被篡改
用 final 修饰方法:禁止子类重写
在方法返回类型前加 final,表示该方法可以被继承、调用,但不能被子类 override(重写)。注意:它不影响重载(overload)。
- 语法示例:
public final void doSomething() { ... } - 常见使用场景:父类中已实现关键逻辑(比如模板方法中的钩子、安全校验步骤),不希望子类绕过或修改其行为
- 如果一个类是 final 的,那它里面所有方法自然也无法被重写——此时再给方法加 final 是冗余的,但不报错
注意事项和常见误区
final 不等于 private,也不影响运行时行为本身;它只在编译期施加约束。
- final 方法仍可被继承和调用——只是不能重写。子类对象可以直接调用父类的 final 方法
- final 类可以有非 final 方法——只要类本身是 final,这些方法就“事实不可重写”,但显式加 final 更清晰
- 构造器不能用 final 修饰——构造器本来就不参与继承和重写,加 final 会编译错误
- 局部变量、参数也可用 final——那是另一层语义(值不可变),和继承控制无关,别混淆
什么时候该用?
不是“越多越好”,而是“该封才封”。过度使用 final 可能降低可测试性(比如难以 mock)或扩展灵活性。
- 类设计成 final:当你确定它没有合理的子类化场景,且内部状态/行为必须绝对可控(如值对象、工具类、安全敏感类)
- 方法设计成 final:当它是模板方法模式中的具体步骤、含关键校验逻辑、或已被标记为 @Deprecated 且不希望子类继续沿用旧实现
- 不建议仅为了“防止别人乱改”而全局加 final——应配合文档、代码审查和团队规范一起使用











