源于《java编程思想》的学习
可能使用到final的三种情况:数据、方法和类。
如果final修饰的是基本数据类型,则在编译时执行计算式,减轻运算时的负担。
final用于对象引用,final引用恒定不变。一旦引用初始化时指向这个类,就不能改为指向另一个类,但这个类中的数据可以改变。
public class FinalData {
private final int [] a={1,2,3,4,5,6};//修饰数组
private final Value v2=new Value(22);//修饰类
public static void main(String[] args) {
FinalData fd1=new FinalData("fd1");
//引用指定的对象不变,但对象的值可以修改。
for (int i = 0; i < fd1.a.length; i++) {
fd1.a[i]++;
}
fd1.v2.i++;
}
}
private final int i4=rand.nextInt(20);// i4在每次创建新对象时都初始化
static final int INT_5=rand.nextInt(20);// INT_5在装载时已被初始化,而不是每次创建新对象时都初始化。
《2》空白final
java允许生成"空白final",所谓空白final是指被声明为final但右未给定初值的域。无论什么情况,编译器都确保空白final在使用前必须被初始化。
public class BlankFinal {//这种情况下 编译会报错
private final int i=0;
private final int j;
private final Poppet p;
}
public class BlankFinal {//编译通过
private final int i=0;
private final int j;
private final Poppet p;
public BlankFinal(){
j=1;
p=new Poppet(1);
}
}
空白final在关键字final的使用上提供了更大的灵活性。