final 在 Java 中有什么作用?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
final 修饰变量时,限制它只能被赋值一次;修饰方法时,禁止子类重写;修饰类时,禁止被继承。final 引用指向的对象仍可能变化,所以 final 与“整个对象不可变”不是同一个概念。
讲清原理
final 字段不一定必须在声明处赋值,也可以在允许的初始化位置完成赋值,但编译器要能确认使用前已正确赋值且不会再次赋值。final 局部变量也遵守明确赋值规则。
并非所有 final 变量都属于编译期常量。例如运行时计算得到的 final int,与用常量表达式初始化的 final int,在某些编译规则下不同。final 也不能替代锁:引用固定了,不代表被引用列表的增删已经线程安全。
例子与易错点
final int limit = 3;
final int[] values = {1, 2};
values[0] = limit; // 允许修改数组元素
System.out.println(values[0]); // 3
若再给 values 赋一个新数组则不允许。设计不可变类还要限制状态修改、避免泄露内部可变引用,并考虑安全发布;仅给字段加 final 不足以包办这些问题。
相关题:第 29 题、第 34 题、第 49 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。