final可以修饰成员变量、局部变量、类和方法
final修饰的数据都是常量,数据类型分为基本数据类型和引用数据类型。
final修饰基本类型的数据时,是不可修改的,只能赋值一次。如下图,修改会报错。
final会固定指向堆中的地址
它在修饰成员变量时必须赋值,因为它是放在堆中的而且有默认值,如果使用final就跟没使用一样,所以必须先赋值。
而修饰局部变量时只有方法入栈时才会运行,所以它不复制不会报错,但你使用这个变量时会报错,因为没有赋值,所以局部变量使用final也需要赋值但不复制不会报错,赋值只能赋一次。
修饰引用类型的数据是可以修改的,因为引用类型是指向堆中的地址的,堆中的变量地址可以改变。如下图:
final固定的是一个地址,修饰的全局变量必须赋值。
final修饰的方法继承后不能重写。
final修饰的类不能被继承。
final可以防止命令重排序,保证线程安全。