Java并发编程学习十三:final关键字和不变性
一、final的用法
final 是 Java 中的一个关键字,final 的作用意味着“这是无法改变的”。它可以用来修饰变量、方法或者类,而且在修饰不同的地方时,效果、含义和侧重点也会有所不同
1. final 修饰变量
关键字final 修饰变量意味着这个变量一旦被赋值就不能被修改了,如果尝试对一个已经赋值过 final 的变量再次赋值,就会报编译错误。
/**
* 描述: final变量一旦被赋值就不能被修改
*/
public class FinalVarCantChange {
public final int finalVar = 0;
public static void main(String[] args) {
FinalVarCantChange finalVarCantChange = new FinalVarCantChange();
// finalVarCantChange.finalVar=9; //编译错误,不允许修改final的成员变量
}
}
final修饰变量的目的有两个:一是我们希望创建一个一旦被赋值就不能改变的量;二是不可变的对象天生就是线程安全的,而如果 final 修饰的是基本数据类型(注意,只有在修饰基本数据类型才能保证不变性),那么它自然就具备了不可变这个性质,所以自动保证了线程安全
final修饰的变量有三种:
- 成员变量,类中的非 static 修饰的属性;
- 静态变量,类中的被 static 修饰的属性;
- 局部变量,方法中的变量。
a. 修饰成员变量
对于这种成员变量而言,被 final 修饰后,它有三种赋值时机:
第一种:在声明变量的等号右边直接赋值:
public class FinalFieldAssignment1 {
private final int finalVar = 0;
}
第二种:在构造函数中赋值
class FinalFieldAssignment2 {
private final int finalVar;
public FinalFieldAssignment2() {
finalVar = 0;
}
}