final关键字在java中表示“不可变”,但约束对象不同:修饰类时禁止继承,修饰方法时禁止重写,修饰变量时仅保证引用或值不可再赋值;三者均为编译期强制限制,分别保障安全性、行为稳定性和只读语义。

final 关键字在 Java 中表示“不可变”,但它对类、方法、变量的约束方式各不相同,不能一概而论为“完全锁死”。用对的关键在于理解它到底“不许改什么”。
修饰类:禁止继承
被 final 修饰的类无法被其他类继承,编译器会直接拒绝子类定义。
- 典型例子:String、Math、Scanner 都是 final 类,防止行为被意外覆盖
- 适用场景:工具类(如 StringUtils)、安全敏感类、设计上不允许扩展的核心类
- 注意:final 类中的所有方法自动具备 final 效果(因为没子类可重写)
- 限制:不能和 abstract 同时使用——抽象类本意就是被继承,逻辑矛盾
修饰方法:禁止重写
final 方法可以被子类继承并调用,但不能被重写(override),保证核心逻辑不被篡改。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 常见位置:父类中关键流程方法(如 verifySignature()、calculateTax())
- 搭配建议:常与模板方法模式结合,固定骨架,只开放非 final 的钩子方法
- 注意:构造方法不能用 final 修饰——它本来就不参与继承和重写
修饰变量:引用或值不可再赋值
final 变量一旦初始化完成,就不能再指向新值或新对象,但“对象内容是否可变”取决于类型本身。
- 基本类型(int、boolean 等):值不可变。final int x = 5; 后续 x = 6 编译报错
-
引用类型(List、User、String 等):引用地址不可变,但对象内部状态可能可变。例如 final List
list = new ArrayList(); 允许 list.add("a"),但不允许 list = new LinkedList() - 初始化要求:成员变量需在声明时、构造器中或实例/静态代码块里完成赋值;局部变量必须在使用前明确赋值一次
- 提示:若要真正“不可变集合”,应配合不可变API,如 List.of()、Collections.unmodifiableList()
final 不是万能锁,它只管“赋值动作”是否发生,不管对象内部怎么变。理解这点,才能避免线上超卖、验签失败这类典型事故。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










