final注意事项
final的单次赋值特性
一旦赋值就不能够改变,就连自己赋值都不行!以下代码报错。
final String str = "a"; str = str; |
final与引用变量
final修饰的基本类型变量是指的值不能发生改变,而final修饰的引用类型的值是指地址不变。所以以下代码成立。
final int[] arr = { 2, 6, 9, 4, 5 }; arr[2] = 15; |
final变量与方法的调用
这个和普通方法的传值过程一样:都是传递一个副本。以下代码1的结果依然是10。
public static void main(String[] args) { int j = 10; plus(j); System.out.println(j);// 1 }
public static void plus(int i) { i++; System.out.println(i);// 2 }
|
除此之外,方法在参数列表上可以控制变量的特性,2处的结果为11。也就是说如果将plus代码改为以下则会报错,因为在plus的局部,i是一个final的变量。
public static void plus(final int i) { i++; System.out.println(i); }
|
非静态final变量的加载
非静态final变量必须在创建对象之前做到初始化。
有以下三种可能:
①直接赋值
②在构造块中
③在构造器中
请看以下几种情况:
这张图出现了问题因为在调用无参构造器的时候final变量没有进行初始化。以下的几张图会修正这个错误。
二次赋值造成的错误。
在构造器中都进行初始化。
调用构造器间接初始化。
在构造快中初始化。
静态final变量的加载
在类加载完成之前初始化
①直接赋值
②在静态块中赋值
常见final变量
Arr.length和System.in|out这两个值表面是null的final常量但是在底层却不是以常量的形式存在的。