final修饰类可禁止继承,修饰方法可禁止重写;final类不可被继承但可继承其他类并实现接口,其方法自动为final;final方法可被继承调用但不可重写;private方法无需加final,构造方法不能用final修饰。

用 final 修饰类或方法,是 Java 中防止继承和重写的直接手段。它的作用很明确:一旦加了 final,编译器就会强制阻止后续的继承或覆盖行为。
用 final 修饰类:彻底禁止被继承
在类声明前加上 final 关键字,该类就无法被任何其他类继承。尝试继承会触发编译错误。
例如:
final class UtilityHelper {public void doSomething() { /* ... */ }
}
此时若写 class MyHelper extends UtilityHelper { },编译器会报错:"Cannot inherit from final 'UtilityHelper'"。
- 适用于工具类、常量容器类(如 java.lang.String)、设计上不允许扩展的核心类
- 注意:final 类中的方法自动成为 final 方法(即使没显式写),但字段不会自动变成 final,仍需单独声明
- final 类可以继承其他类,也能实现接口,只是不能被别人继承
用 final 修饰方法:锁定具体实现,禁止重写
在方法签名前加 final,子类就无法覆盖该方法。哪怕子类有同名、同参数、同返回类型的方法,也会编译失败。
例如:
class Parent {public final void calculate() {
System.out.println("fixed logic");
}
}
子类中写 @Override public void calculate() { ... } 会导致编译错误。
- 适合关键业务逻辑、安全敏感操作、模板方法模式中的钩子方法之外的固定步骤
- private 方法天然不可被重写(子类不可见),所以无需加 final;但 final + private 是冗余写法,不推荐
- 构造方法不能用 final 修饰(它本来就不参与继承链中的“重写”)
注意事项与常见误区
- final 修饰的是“不可变性”,不是“不可访问性”——final 类的对象可以正常创建和调用其 public 方法
- final 方法仍可被子类继承并直接调用,只是不能改写行为
- 不要为了“预防未来修改”而滥用 final;应在设计阶段明确扩展意图后再决定——开放封闭原则(OCP)提醒我们:对扩展开放,对修改关闭,但不是对继承完全关闭
- final 类不能是抽象类(二者语义冲突),也不能有 abstract 方法
替代思路:比 final 更柔性的控制
如果不想彻底封死继承,但又希望限制随意重写,可以考虑:
- 把方法设为 private 或包级私有(默认访问权限),缩小可见范围
- 使用 template method 模式:父类定义 final 模板方法,调用若干 protected 的钩子方法,由子类选择性实现
- 通过文档和代码审查约定“不建议重写”,配合 IDE 警告(如 @Deprecated + 注释)引导协作

















