跳轉至內容

Java 程式設計/關鍵字/final

來自華夏公益教科書,自由的教科書

final 是一個關鍵字。注意!它的含義取決於它用於類、方法還是變數。它必須放在變數型別或方法返回型別之前。建議將其放在訪問修飾符之後以及static 關鍵字之後。

Example 程式碼部分 1:關鍵字順序。
private static final long serialVersionUID = -5437975414336623381L;

對於變數

[編輯 | 編輯原始碼]

final 關鍵字只允許對變數進行一次賦值。也就是說,一旦變數被賦值,它的值就變成了只讀。如果變數是基本型別,它的值將不再改變。如果它是一個物件,只有它的引用將不再改變。請記住,它的值仍然可以改變。

Warning 程式碼部分 2:禁止雙重賦值。
final int a = 1;
a = 2;
Example 程式碼部分 3:只修改物件的價值。
final ArrayList list = new ArrayList();
System.out.println(list.size());
list.add("One item");
System.out.println(list.size());
Standard input or output 程式碼部分 3 的控制檯
0
1

一個 final 變數經常被用於通用常量,例如 pi

Example 程式碼部分 4:Pi 常量。
static final double PI = 3.1415926;

final 關鍵字也可以用於方法引數

Example 程式碼部分 5:final 方法引數。
public int method(final int inputInteger) {
   int outputInteger = inputInteger + 1;
   return outputInteger;
}

它對於使用副作用更新某些物件的方法很有用。此類方法修改了作為引數傳遞的物件的內容。方法呼叫者將收到物件更新。如果物件引數在方法中被重新賦值,這將失敗。將更新另一個物件而不是。final 方法引數也可以用於保持程式碼整潔。

final 關鍵字類似於其他語言中的const 關鍵字和 C# 中的readonly 關鍵字。final 變數不能是volatile

對於類

[編輯 | 編輯原始碼]

final 關鍵字禁止建立子類。這是 IntegerString 類的案例。

Computer code 程式碼清單 1:SealedClass.java
public final class SealedClass {
  public static void main(String[] args) {
  }
}

final 類不能是abstractfinal 關鍵字類似於 C# 中的sealed 關鍵字。

對於方法

[編輯 | 編輯原始碼]

final 關鍵字禁止在子類中覆蓋方法。如果類已經是 final,並且私有方法隱式地是final,那麼它就毫無用處。final 方法不能是abstract

Computer code 程式碼清單 2:NoOverwriting.java
public class NoOverwriting {
  public final void sealedMethod() {
  }
}

final 關鍵字主要用於保證程式碼的良好使用。例如(非static)方法,這允許編譯器擴充套件方法(類似於行內函數),如果方法足夠小。有時需要使用它。例如,巢狀類只能訪問頂層類的成員,如果它們是 final。

另見 訪問修飾符
華夏公益教科書