用final修饰方法表示该方法不可被子类重写,仅可继承调用。适用于安全校验、模板方法骨架步骤、不可变业务规则及父类已提供完整实现的场景,添加final关键字即可,编译器会阻止子类覆盖。

用 final 修饰方法,就是明确告诉编译器和所有开发者:“这个方法的实现必须固定,子类可以调用它,但不能改写它”。这是保护核心逻辑最直接、最可靠的方式。
什么时候该用 final 修饰方法
适合加 final 的方法通常具备以下特征:
- 涉及安全校验(如登录权限检查、支付参数验证);
- 属于模板方法模式中的“骨架步骤”(比如流程控制类里的
process()); - 封装了不可变的业务规则(如税率计算、日期格式化逻辑);
- 父类已提供完整实现,且设计上不允许子类覆盖行为。
怎么写才有效
只需在方法声明前加上 final 关键字即可。注意三点:
- 修饰符顺序不影响语义,常见写法是
public final void methodName(); - 子类继承该类后,若尝试用
@Override重写此方法,编译器会直接报错; -
final方法仍可被子类继承并正常调用,只是不能改变其实现。
典型示例:支付流程中的校验环节
假设父类定义了一个标准支付流程,其中订单校验逻辑必须统一执行:
立即学习“Java免费学习笔记(深入)”;
public abstract class PaymentProcessor {
// 模板方法:流程固定,不可重写
public final void execute(Order order) {
validate(order); // 关键校验,final 锁定
doActualPay(order); // 由子类实现
notifyResult(order); // 固定通知,final 锁定
}
// 子类不得修改校验逻辑
private final void validate(Order order) {
if (order == null || order.getAmount() <= 0) {
throw new IllegalArgumentException("非法订单");
}
}
// 抽象方法:允许子类定制具体支付方式
protected abstract void doActualPay(Order order);
private final void notifyResult(Order order) {
System.out.println("支付完成:" + order.getId());
}
}
子类只能实现 doActualPay,而 validate 和 notifyResult 无法被覆盖——哪怕加了 @Override,也会编译失败。
容易忽略的细节
记住几个关键点:
-
private方法天然具有 final 效果(子类根本看不见,谈不上重写); -
final不影响方法重载(只要参数列表不同,就可以定义同名新方法); - 如果父类方法本就未被子类重写,加
final是一种主动防御,不是补救措施。


















