final 关键字作用
面试官问:"final 关键字有什么作用?"
候选人小曹答:"final 修饰的变量不能被修改。"
面试官点点头,又问:"final 修饰的变量,如果是引用类型呢?"
小曹说:"引用不能变。"
面试官追问:"那引用的对象能变吗?"
小曹说:"能。"
面试官又问:"那 String 为什么是不可变的?"
小曹答:"因为 String 用 final 修饰了..."
面试官:"不对,String 底层是一个 char 数组,final 只保证引用不变,不保证数组内容不变。"
小曹彻底懵了。
【面试官心理】 这道题能精准区分"背概念"和"真理解"的候选人。final 修饰引用类型时,只保证引用不变(地址不变),不保证对象内容不变。String 的不可变是多重设计保证的,不是单纯靠 final。
一、final 的三种用法 🔴
二、final 修饰变量 🔴
2.1 基本类型 vs 引用类型
⚠️
final 和不可变是两回事:
final修饰数组:引用不变,数组内容可变- String 不可变:需要 final(防止引用重定向)+ 无修改方法 + 私有化(防止外部访问数组) :::
2.2 final 变量的初始化
2.3 blank final(空白 final)
三、final 修饰方法 🔴
3.1 规则
3.2 为什么用 final 方法
:::tip 💡 JIT 编译器对 final 方法可以做更多激进优化。但现代 JVM 的逃逸分析已经非常智能,final 的性能提升已经不明显了。final 更重要的价值是设计意图的表达和代码可读性。
四、final 修饰类 🔴
4.1 不可继承
4.2 final 类中的方法默认是 final 吗?
五、final 的最佳实践 🔴
5.1 不可变对象
5.2 局部变量用 final
六、与 static 的组合使用 🔴
七、追问升级
面试官:"static final 和 final static 有区别吗?"
面试官:"为什么 IntegerCache 缓存 -128~127,而不是更大的范围?"
【面试官心理】 能说出 IntegerCache 范围选择的候选人是真正研究过 JDK 源码的。这个细节是 P6+ 的加分项。