1. 修饰变量 当一个变量被声明为 final 时,它的值一旦赋值后就不能再更改。这适用于基本数据类型和引用类型。修饰引用类型时,表示该引用无法再指向其他对象,但引用所指向的对象的内容可以发生改变。
2. 修饰方法 被 final 修饰的方法不能被子类重写。这有助于防止改变方法的行为。
3. 修饰类 当一个类被声明为 final 时,不能被继承。这可以防止类的扩展,确保其行为不被改变。
4. 修饰参数 在方法参数中使用 final 可以防止在方法内部修改该参数的值,增加代码的可读性和安全性。
5.内存可见性 在多线程环境中,使用 final 变量可以确保在一个线程中初始化的对象,对其他线程是可见的。这是因为在 Java 内部,final 变量的写操作和对该变量的读取会添加内存屏障,从而确保:其他线程看到 final 变量的值时,一定是对象的完全初始化状态。
6. 构造函数和 final 变量 如果一个对象的构造函数中初始化了 final 变量,那么一旦构造函数完成,这个对象的 final 变量的值对所有线程都是可见的。这是因为 JVM 会在构造器完成后插入一个内存屏障,确保所有写入的字段都对其他线程可见。