1、概述
a、final关键字可用于变量声明,一旦该变量设定,就不可以在改变该变量的值。通常,由final定义的变量为常量。
b、final关键字定义的变量必须在声明是对其进行赋值操作。
c、final出了可以修饰基本数据类型的常量,还可以修饰对象引用。
d、在被定义为final的常量时需要使用大写字母命名,并且中间使用下划线进行连接,这是Java中的编码规则。
e、在Java中定义全局变量,通常使用public static final修饰,这样的常量只能在定义时被赋值。
例11.4
1 package com.lzw; 2 import static java.lang.System.out; 3 import java.util.Random; 4 5 class Test{ 6 int i = 0; 7 } 8 9 public class FinalData { 10 static Random rand = new Random(); 11 private final int VALUE_1 = 9; //声明一个final常量 12 private static final int VALUE_2 =10; //声明一个final、static常量 13 private final Test test = new Test(); //声明一个final引用 14 private Test test2 = new Test(); //声明一个不是final的引用 15 private final int[] a = {1,2,3,4,5,6}; //声明一个定义为final的数据 16 private final int i4 = rand.nextInt(20); 17 private static final int i5 = rand.nextInt(20); 18 public String toString() { 19 return i4 + " " + i5 + " "; 20 } 21 22 //主方法 23 public static void main(String[] args) { 24 FinalData data = new FinalData(); 25 //可以对指定为final的引用中的成员变量赋值,但不能将定义为final的引用指向其它引用 26 // data.test = new Test(); 27 // data.VALUE_2++; 28 29 //不能改变定义为final的常量值 30 data.test2 = new Test(); 31 32 for(int i=0;i<data.a.length;i++) { 33 //不能对定义为final的数组赋值 34 // a[i] = 9; 35 } 36 37 out.println(data); 38 out.println("data2"); 39 out.println(new FinalData()); 40 out.println(data); 41 } 42 }
2、通常一个被定义为final的对象引用只能指向唯一一个对象,不可以将它在指向其它对象,但是一个对象本身的值却是可以改变的,那么为了使一个常量真正做到不可更改,可以将常量声明为static final。
例11.5
1 package com.lzw; 2 import java.util.Random; 3 import static java.lang.System.out; 4 5 public class FinalStaticData { 6 private static Random rand = new Random(); //实例化一个Random类对象 7 private final int a1 = rand.nextInt(10); //随机产生0~10之间的随机数赋予定义为final的a1 8 private static final int a2 =rand.nextInt(10); 9 10 //主方法 11 public static void main(String[] args) { 12 //实例化一个对象 13 FinalStaticData fdata = new FinalStaticData(); 14 out.println("重新实例化调用a1的值:" + fdata.a1); //调用定义为final的a1 15 out.println("重新实例化调用a2的值:" + fdata.a2); //调用定义为static final的a2 16 17 //实例化另外一个对象 18 FinalStaticData fdata2 = new FinalStaticData(); 19 out.println("重新实例化调用a1的值:" + fdata2.a1); //调用定义为final的a1 20 out.println("重新实例化调用a2的值:" + fdata2.a2); //调用定义为static final的a2 21 } 22 23 }