Java 關鍵字之 final

GuyCui發表於2021-11-15

歡迎學習 Java 基礎文章系列之 final 關鍵字

  • final 代表什麼意思?
    • final 通常是指無法被改變或者不能被改變的,什麼情況下不想被改變呢?
      • 不想改變可能有兩種原因:設計或者效率。
  • 在Java中 final 關鍵字會在哪幾個地方使用到?
    • 有三種地方使用:資料(成員變數、引數)、方法、類。
      • final 資料(成員變數、引數)
        常量以關鍵 final 表示,必須是基本資料型別。
        對於基本型別使數值恆定不變,而用於物件引用,使引用恆定不變,一旦引用被初始化指向一個物件,就無法改為指向另一個物件,然而物件其自身卻是可以被修改的,Java 並未提供使任何物件恆定不變的途徑(但是可以自己編寫類已取得是物件恆定不變的效果),這一限制同樣適用於陣列,它也是物件。
        • 空白 final
          Java 允許生成:“空白 final”,即被宣告為 final 但又未給定初始值的域。
        • final 引數
          Java中允許在引數列表中以宣告的方式將引數指明為 final。無法在方法中更改引數引用所指向的物件。
          你可以讀取引數,但卻無法修改引數,這一特性主要用來向匿名類傳遞資料。
      • final 方法
        final 方法的考慮:出於對設計的考慮:確保在繼承中使方法行為保持不變,並且不會被覆蓋,或者出於效率(遭受勸退了)。
        該方法不會被重寫(覆蓋、覆寫)。
        final 和 private 關鍵字
        類中所有的 private 方法都是隱式地指定為 final 的。由於無法使用 private 宣告的方法,所以也就無法重寫該方法。
        如果試圖重寫一個 private 方法(隱含式的 final),似乎是可行的,並且編譯器也不會提示錯誤。
        “重寫(覆蓋、覆寫)”只有在某方法是父類的介面(非interface)的一部分時才會出現。
        final修飾的方法在特定的訪問許可權下可以被繼承。
        這是因為,方法是否被final修飾與方法的訪問許可權是兩回事,沒有任何關係,被final修飾的方法和未被final修飾的方法都可以自由的指定訪問許可權。
        我們有興趣去談論final關鍵字和訪問許可權關鍵字在修飾方法的過程的起到的作用,如下表(宣告:final和訪問許可權是兩個獨立的概念,沒有任何比較意義,所有本表僅方便讀者理解,不可作為正統知識)
protect關鍵字 final關鍵字 private關鍵字
是否可以繼承
是否可以重寫
小結 private < final < protect (僅適用於方法)

正如上表所示,private實現了final方法不可重寫的功能,並附加不可繼承功能。(再次宣告:final和訪問許可權是兩個獨立的概念,沒有任何比較意義,所有上表僅方便讀者理解,不可作為正統知識)可以對private方法新增final關鍵字,但是這種做法沒有任何意義。

	* final 類

final 類的考慮:對該類的設計永不需要做任何變動,或者出於安全的考慮不希望它有子類。
該類不能被繼承,final 類中所有的方法都是隱式指定為 final 關鍵字的。

相關文章