Skip to content
基础

一句话答案

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. 修饰类

  • 该类不能被继承
  • 典型:StringIntegerMath 都是 final
  • 好处:保证安全性(不被恶意子类覆盖),JIT 可做更激进的内联优化

补充:final 与线程安全

  • final 字段在构造函数完成后对其他线程可见(JMM 保证),不需要额外同步
  • 这是 String 不可变且线程安全的基础之一
追问与易错

追问方向:

  • final 修饰引用类型意味着什么?(引用不可变,但对象内容可变)
  • final 方法能被重载吗?(可以重载,不能重写)
  • 为什么 String 是 final 类?(不可变性保证)

易错点:

  • ❌ "final 变量就是常量"——引用类型的 final 变量指向的对象内容仍可修改
  • ❌ "final 方法是为了性能"——JDK 早期是为了内联,现在 JIT 自动优化,主要是设计意图

💡 记忆锚点

final三把锁:锁类(不可继承)、锁方法(不可重写)、锁变量(不可重新赋值)。但锁引用不锁内容——final List像把钥匙焊在锁上,箱子里的东西照样能换。