final关键字可用于变量声明,一旦该变量被指定,就不可以再改变该变量的值。通常,由final定义的变量为常量。
final关键字定义的变量必须在声明时对其进行赋值操作,通过以下示例来说明final关键字:
import static java.lang.System.out;
import java.util.Random;
class Test{
int i = 0;
}
public class FinalData {
static Random rand = new Random();
private final int VALUE_1 = 9;//声明一个final常量
private static final int VALUE_2 = 10;//声明一个final、static常量
private final Test test = new Test();//声明一个final引用
private Test test2 = new Test();//声明一个不是final的引用
private final int[] a = {1,2,3,4,5,6};//声明一个定义为final的引用
private final int i4 = rand.nextInt(20);
private static final int i5 = rand.nextInt(20);
public String toString() {
return i4+" "+i5+" ";
}
public static void main(String args[]) {
FinalData data = new FinalData();
//data.test = new Test();
//可以对指定为final的引用中的成员变量赋值
//但不能将定义为final的引用指向其他引用
//data.VALUE_2++;
//不能改变final定义的常量
data.test2 = new Test();//可以将没有定义为final的引用指向其他类
for(int i =0;i<data.a.length;i++) {
//a[i] = 9;//不能对定义为final的数组进行赋值
}
out.println(data);
out.println("data2");
out.println(new FinalData());
out.println(data);
}
}
/*输出结果如下:
1 13
data2
9 13
1 13
*/
在上述示例中,被定义的final的常量定义时需要使用大写字母命名,并且中间使用下划线进行连接,这是Java中的编码规则。
我们知道一个被定义为final的对象引用只能指向唯一一个对象,不可以将它再指向其他对象,但是一个对象本身的值却可以改变,为了使一个常量真正做到不可更改,可以将常量声明为static final,示例如下:
import java.util.Random;
import static java.lang.System.out;
public class FinalStaticData {
private static Random rand = new Random();//实例化一个Random类对象
//随机产生0-10之间的随机数赋予定义为final的a1
private final int a1 = rand.nextInt(10);
//随机产生0-10之间的随机数赋予定义为static final的a2
private static final int a2 = rand.nextInt(10);
public static void main(String args[]) {
FinalStaticData fdata = new FinalStaticData();//实例化一个对象
//调用定义为final的a1
out.println("重新实例化对象调用a1的值:"+fdata.a1);
//调用定义为static final的a2
out.println("重新实例化对象调用a2的值:"+fdata.a2);
//实例化另一个对象
FinalStaticData fdata2 = new FinalStaticData();
out.println("第二次重新实例化对象调用a1的值:"+fdata2.a1);
out.println("第二次重新实例化对象调用a2的值:"+fdata2.a2);
}
}
/*输出结果如下:
重新实例化对象调用a1的值:0
重新实例化对象调用a2的值:1
第二层重新实例化对象调用a1的值:5
第二层重新实例化对象调用a2的值:1
*/