Java final修飾符:final修飾屬性、final修飾方法及final修飾類

2020-07-16 10:05:08
final 關鍵字表示物件是最終形態的,物件是不可改變的意思。final 應用於類、方法和變數時意義是不同的,但本質是一樣的:final 表示不可改變。

final 用在變數的前面表示變數的值不可以改變,此時該變數可以被稱為常數;final 用在方法的前面表示方法不可以被重寫;final 用在類的前面表示類不可以被繼承,即該類是最終形態,如常見的 java.lang.String 類。

final 修飾符使用在如下方面:

1. final 修飾類中的屬性

表示該屬性一旦被初始化便不可改變,這裡不可改變的意思對基本型別來說是其值不可變,而對物件屬性來說其參照不可再變。其初始化可以在兩個地方:一是其定義處,也就是說在 final 屬性定義時直接給其賦值;二是在建構函式中。這兩個地方只能選其一,要麼在定義時給值,要麼在建構函式中給值,不能同時既在定義時賦值,又在建構函式中賦予另外的值。

2. final 修飾類中的方法

說明這種方法提供的功能已經滿足當前要求,不需要進行擴充套件,並且也不允許任何從此類繼承的類來重寫這種方法,但是繼承仍然可以繼承這個方法,也就是說可以直接使用。在宣告類中,一個 final 方法只被實現一次。

3. final 修飾類

表示該類是無法被任何其他類繼承的,意味著此類在一個繼承樹中是一個葉子類,並且此類的設計已被認為很完美而不需要進行修改或擴充套件。

對於 final 類中的成員,可以定義其為 final,也可以不是 final。而對於方法,由於所屬類為 final 的關係,自然也就成了 final 型。也可以明確地給 final 類中的方法加上一個 final,這顯然沒有意義。

例 1

下面建立一個範例演示 final 修飾符的具體使用。首先新建 FinalTest.java 檔案,在該檔案中建立 FinalTest 類,定義一個宣告為 final 的 count 屬性和一個宣告為 final 的 sum() 方法。

FinalTest 類的程式碼如下:
public class FinalTest {
    final int count = 1;
    public int updateCount() {
        count = 4;    // 修改final屬性值,提示錯誤
        return count;
    }
    public final int sum() {
        int number = count+10;
        return number;
    }
}

建立 FinalTest 類的子類 FinalExtendTest,在該類中重寫父類別 FinalTest 中的 sum() 方法,並繼承父類別中的 sum() 方法。程式碼如下:
public class FinalExtendTest extends FinalTest {
    public int sum(){};    // 重寫父類別 FinalTest 中的 sum()方法,出錯
    int count = sum();    // 繼承父類別 FinalTest 中的 sum()方法
}

最後在 FinalExtend 類中新建程式主方法——main() 方法,範例化 FinalExtendTest 類並存取該類的 count 屬性,程式碼如下所示。
public static void main(String[] args) {
    FinalExtendTest fet = new FinalExtendTest();
    System.out.println(fet.count);
}

在編譯該檔案時,會出現兩處錯誤:一是程式碼“count=4;”處,此處試圖給 count 變數重新賦值,會產生錯誤,因為 final 變數只能被初始化一次。第二處是程式碼“public int sum(){};”,此處試圖重寫 final 修飾的方法,會出現錯誤,因為 final 修飾的方法可以被繼承但不能被任何類重寫。

將兩處的錯誤語句都注釋掉,程式執行後輸出的結果如下:
11