final关键字详解
final 关键字详解
final
关键字在Java中有三种主要用法,分别用于修饰变量、方法和类。以下是对final
关键字的详解。
基本使用场景
修饰变量
final
变量一旦初始化之后,值就不能再改变。可以是成员变量,也可以是局部变量。对于成员变量:
必须在声明时或者在构造函数中赋值。
对于局部变量,必须在声明时或者在代码块中赋值。
final 修饰引用的时候,引用的值初始化后就不可变了,但是引用的内容可以变化
修饰方法
final
方法不能被子类重写,但可以被继承。使用
final
关键字修饰的方法通常是设计用来实现类的核心功能,目的时:为了防止不安全的修改
提高效率:
final
方法在编译时会被内联(JVM优化),提高执行效率。
修饰类
final
类不能被继承。使用
final
关键字修饰的类通常是设计用来防止继承修改的类,常用于工具类或基础类库。
其他特定使用场景
- 匿名类
在匿名内部类中使用的局部变量必须是
final
或“事实上的final
”(即虽然未声明为final
但在作用域内没有改变)。
- Lambda表达式内部
在Lambda表达式中使用的局部变量也必须是
final
或“事实上的final
”(Java8 以后)。
- 枚举类型
所有的枚举常量都是隐式
final
,枚举类型也隐式final
。
最佳实践
- 常量定义:对于常量,使用
public static final
修饰符来确保其值不可改变。 - 防止对象被修改:对于类中的引用类型变量,使用
final
关键字确保引用不被改变,从而增强代码的安全性和可维护性。 - 不可变类:创建不可变类时,类本身应是
final
,并且所有字段都应是final
。
常见误区
final
不是不可变:final
关键字修饰引用类型时,引用不可变,但引用对象内容可变。final
不是线程安全:final
变量不保证线程安全性,引用对象的内容修改仍需考虑线程同步。final
提高效率:虽然final
方法有内联优化,但并不是所有情况都能提高效率,具体情况需视JVM优化策略而定。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CautionX!