final關鍵字能夠修飾不一樣的內容,這些內容僅包括一個變量,一個方法或者一個類,如下是final修飾這些內容的做用:java
當一個變量被final關鍵字修飾時,意味着它的值不能夠被修改了,也就是說,這個變量表示一個常量。這也意味着final變量必須被初始化。若是一個final變量表示的是一個對象的引用,那麼該變量就不能從新表示另外一個對象的引用了,可是這個final變量指向的對象的內部狀態是能夠改變的,例如,咱們能夠向一個final array或者final collection中增長或者刪除元素。另外,使用大寫字母和下劃線表示一個final變量是個好習慣。app
Exampleside
// a final variable final int THRESHOLD = 5; // a blank final variable final int THRESHOLD; // a final static variable PI static final double PI = 3.141592653589793; // a blank final static variable static final double PI;
初始化一個final變量函數
咱們必須初始化一個final變量,不然編譯器將會拋出錯誤。一個final變量只能被初始化一次,能夠經過初始化器或者初始化語句對其進行初始化。有三種方法能夠初始化一個final變量:ui
Examplescode
//初始化final變量的方法 class Test { //直接初始化 final int THRESHOLD = 5; //blank final變量 final int CAPACITY; final int MAXMUM; //blanck static final變量 static final int MINIMUM; //使用初始化器 { CAPATICY = 25; } //使用static代碼塊 static { MAXMUM = 125; } //使用構造函數 public Test() { MINIMUM = -1; } }
何時須要使用final變量對象
一個普通變量和一個final變量之間惟一的區別就是一旦給final變量賦值,則該變量的值將不能夠再被改變。所以,final變量只能用於咱們但願在整個程序執行過程當中保持不變的值。繼承
final變量的值是對象的引用編譯器
當一個final變量是一個對象的引用,咱們把這個變量稱爲引用final變量(reference final variable),例如一個StringBuffer的final變量能夠是final StringBuffer sb
,咱們知道一個final變量是不能夠再從新賦值的,可是這個final變量指向的對象的內部狀態是能夠改變的,這種final屬性能夠稱爲非傳遞性。it
Examples
class Test { public static void main(String[] args) { // a final reference variable sb final StringBuilder sb = new StringBuilder("Test"); System.out.println(sb); // changing internal state of object // reference by final reference variable sb sb.append("ForTest"); System.out.println(sb); } } //輸出爲: //Test //TestForTest
a. final變量不能從新賦值,不然出現編譯錯誤
b. 局部final變量必須在其建立後就對其進行賦值
c. 對比C++的const變量,const變量在聲明的時候就須要賦初值,而final變量能夠先聲明再賦值,但只能賦值一次
d. foreach循環中,final修飾變量是合法的,栗子以下
// Java program to demonstrate final // with for-each statement class Test { public static void main(String[] args) { int arr[] = {1, 2, 3}; // final with for-each statement // legal statement for (final int i : arr) System.out.print(i + " "); } } //輸出:1 2 3
這裏能夠這樣使用的緣由是每次迭代時至關於從新對i進行了聲明
final類沒法被繼承,有兩種使用狀況:
Integer
,Float
等都是final類一個被final修飾的方法是沒法被重載的,對於一個含有final方法的父類,在其派生類中該方法必須和父類中的方法保持相同的實現
Example
class A { final void m1() { System.out.println("This is a final method."); } } class B extends A { void m1() { // COMPILE-ERROR! Can't override. System.out.println("Illegal"); } }