在Java编程中,final是大家常用的一个修饰符。该修饰符的英文字面意思就是最终的, 那我们从字面意思可以了解到被final修饰的类,方法或者变量即是最终的一个状态。
final修饰符的解释:
1.修饰类 : 该类不可被继承。
2.修饰方法: 该方法不可被子类重写。
3.修饰变量: 该变量必须在初始化的时候赋值,而且一旦赋值后不可被修改。
赋值的方式可以在1.定义变量的时候赋值;2.在初始化块的时候赋值 3.在类的构造方法中复制。
public class Test{ // 在定义变量的时候赋值 private final int a = 10; private final int b; // 在初始化块中赋值 { b = 100; } private final int c; // 在构造方法中赋值 public Test() { c = 10; } }
还有一个重要知识点:
在一个方法中,如果在局部类或匿名类中引用外部方法的变量,该变量必须是final修饰的。
原因:
在class编译过程中,外部方法对应的类和局部类或匿名类分别编译成了两个class文件。那么在方法的运行过程中,如果外部方法运营结束,外部方法中声明的变量则会被回收掉,这时候如果局部类或匿名类中引用的外部方法的变量的代码位置还没有运行到的话,就会出现变量找不到的情况,访问到了一个不存在的变量。所以JVM则会拷贝一份内部类中引用的外部方法的变量作为局部类或匿名类的成员变量,这样局部类或匿名类就可以访问这个拷贝后的成员变量,而不会出现变量不存在的问题,延长了这个变量的生命周期。 将外部方法的局部变量复制成为局部类或匿名类的成员变量时,要保证变量是一样的,也就是说如果局部类或匿名类修改了这个变量,外部方法对应的也会修改, 如何解决这个问题? 解决方式就是将这个变量设置为final, 这个变量设置为final后,则不可以被修改,也就保证了外部方法和局部类或匿名类中的变量的一致性。