final關鍵字可用于變量聲明,一旦該變量被設定,就不可以再改變該變量的值。 通常final定義的變量為常量。如:
final double PI = 3.14;
當在程序中使用PI這個常量時,它的值就是3.14,如在程序中再次對定義為final的常量賦值,編譯器將不能接受;
final關鍵字定義的變量必須在聲明時對其進行賦值操作。final除了可以修飾基本數據類型的常量,還可以修飾對象引用。由于數組也可以被用作一個對象引用,所以final可以修飾數組。一旦一個對象引用被修飾為final后,它只能恒定指向一個對象,無法將其改變為另一個對象。一個既是static又是final的字段只占據一段不能改變的存儲空間。如下例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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 ; //并且使用下劃線進行連接; private final Test test = new Test(); private Test test2 = new Test(); private final int [] a = { 1 , 2 , 3 , 4 , 5 , 6 }; 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(); //data.VALUE_2++; data.test2 = new Test(); for ( int i= 0 ; i<data.a.length; i++) { //a[i] = 9; } out.println(data); out.println( "data2" ); out.println( new FinalData()); out.println(data); } } |
一個被定義為final的對象只能指向唯一一個對象,不可以將它指向其他對象,但是一個對象本身的值確實可以改變的,那么為了使一個常量真正做到不可更改,可以將常量說明為static final. 如下例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import static java.lang.System.out; import java.util.Random; public class FinalStaticData { private static Random rand = new Random(); private final int a1 = rand.nextInt( 10 ); private static final int a2 = rand.nextInt( 10 ); public static void main(String[] args) { FinalStaticData fdata = new FinalStaticData(); //實例化一個對象 out.println( "重新實例化對象調用a1的值:" + fdata.a1); out.println( "重新實例化對象調用a2的值:" + fdata.a2); FinalStaticData fdata2 = new FinalStaticData(); // 實例化新對象 out.println( "重新實例化對象調用a1的值:" + fdata2.a1); out.println( "重新實例化對象調用a2的值:" + fdata2.a2); } } |
重新實例化對象調用a1的值:9
重新實例化對象調用a2的值:2
重新實例化對象調用a1的值:1
重新實例化對象調用a2的值:2
總結:
定義為final常量不是恒定不變的,將隨機數賦予final的變量,可以做到每次運行程序時改變a1的值,但是a2被定義為static final形式,所以內存中為a2開辟了一個恒定的區域,當再次實例化一個FianlStaticData對象時,仍然指向a2這塊內存區域,所以a2的值保持不變。
技巧:
在JAVA中定義全局常量,通常使用public static final修飾,這樣的常量只能在定義時被賦值。