跳到主要内容

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;
}
}