外观
一句话答案
final 修饰类不可继承、方法不可重写、变量不可重新赋值(引用不可变但对象内容可变)。
核心要点
final 可以修饰三种目标,语义各不相同:
1. 修饰变量
- 基本类型:值不可变(常量)
- 引用类型:引用地址不可变,但引用指向的对象内容可以改变
java
final int x = 10; // x 不能被重新赋值
final List<String> list = new ArrayList<>();
list.add("ok"); // 合法,list 指向的对象内容可变
list = new ArrayList<>(); // 编译报错,引用不可重新指向2. 修饰方法
- 该方法不能被子类重写(Override)
- 常用于模板方法中需要固定的步骤
3. 修饰类
- 该类不能被继承
- 典型:
String、Integer、Math都是final类 - 好处:保证安全性(不被恶意子类覆盖),JIT 可做更激进的内联优化
补充:final 与线程安全
final字段在构造函数完成后对其他线程可见(JMM 保证),不需要额外同步- 这是
String不可变且线程安全的基础之一
追问与易错
追问方向:
- final 修饰引用类型意味着什么?(引用不可变,但对象内容可变)
- final 方法能被重载吗?(可以重载,不能重写)
- 为什么 String 是 final 类?(不可变性保证)
易错点:
- ❌ "final 变量就是常量"——引用类型的 final 变量指向的对象内容仍可修改
- ❌ "final 方法是为了性能"——JDK 早期是为了内联,现在 JIT 自动优化,主要是设计意图
💡 记忆锚点
final三把锁:锁类(不可继承)、锁方法(不可重写)、锁变量(不可重新赋值)。但锁引用不锁内容——final List像把钥匙焊在锁上,箱子里的东西照样能换。