Java中final变量使用总结
final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。通常final定义的变量为常量。如:
finaldoublePI=3.14;
当在程序中使用PI这个常量时,它的值就是3.14,如在程序中再次对定义为final的常量赋值,编译器将不能接受;
final关键字定义的变量必须在声明时对其进行赋值操作。final除了可以修饰基本数据类型的常量,还可以修饰对象引用。由于数组也可以被用作一个对象引用,所以final可以修饰数组。一旦一个对象引用被修饰为final后,它只能恒定指向一个对象,无法将其改变为另一个对象。一个既是static又是final的字段只占据一段不能改变的存储空间。如下例:
importstaticjava.lang.System.out; importjava.util.Random; classTest{ inti=0; } publicclassFinalData{ staticRandomrand=newRandom(); privatefinalintVALUE_1=9;//final定义的变量必须使用大写字母命名 privatestaticfinalintVALUE_2=10;//并且使用下划线进行连接; privatefinalTesttest=newTest(); privateTesttest2=newTest(); privatefinalint[]a={1,2,3,4,5,6}; privatefinalinti4=rand.nextInt(20); privatestaticfinalinti5=rand.nextInt(20); publicStringtoString() { returni4+""+i5+""; } publicstaticvoidmain(String[]args){ FinalDatadata=newFinalData(); //data.test=newTest(); //data.VALUE_2++; data.test2=newTest(); for(inti=0;i<data.a.length;i++) { //a[i]=9; } out.println(data); out.println("data2"); out.println(newFinalData()); out.println(data); } }
一个被定义为final的对象只能指向唯一一个对象,不可以将它指向其他对象,但是一个对象本身的值确实可以改变的,那么为了使一个常量真正做到不可更改,可以将常量说明为staticfinal.如下例:
importstaticjava.lang.System.out; importjava.util.Random; publicclassFinalStaticData{ privatestaticRandomrand=newRandom(); privatefinalinta1=rand.nextInt(10); privatestaticfinalinta2=rand.nextInt(10); publicstaticvoidmain(String[]args){ FinalStaticDatafdata=newFinalStaticData();//实例化一个对象 out.println("重新实例化对象调用a1的值:"+fdata.a1); out.println("重新实例化对象调用a2的值:"+fdata.a2); FinalStaticDatafdata2=newFinalStaticData();//实例化新对象 out.println("重新实例化对象调用a1的值:"+fdata2.a1); out.println("重新实例化对象调用a2的值:"+fdata2.a2); } }
重新实例化对象调用a1的值:9
重新实例化对象调用a2的值:2
重新实例化对象调用a1的值:1
重新实例化对象调用a2的值:2
总结:
定义为final常量不是恒定不变的,将随机数赋予final的变量,可以做到每次运行程序时改变a1的值,但是a2被定义为staticfinal形式,所以内存中为a2开辟了一个恒定的区域,当再次实例化一个FianlStaticData对象时,仍然指向a2这块内存区域,所以a2的值保持不变。
技巧:
在JAVA中定义全局常量,通常使用publicstaticfinal修饰,这样的常量只能在定义时被赋值。