深入理解 Java 中的 final 關鍵字

概述

Java 中的 final 關鍵字非常重要,它可以應用與類、方法以及變量。這篇文章中我將帶你看看:

  • 什么是 final 關鍵字?
  • 將變量、方法和類聲明為 final 代表了什么?
  • 使用 final 的好處是什么?

最后也有一些使用 final 關鍵字的實例。final 經常和 static 一起使用來聲明常量,你也會看到 final 是如何改善應用性能的。

final 關鍵字的含義

final 在 Java 中是一個保留的關鍵字,可以聲明成員變量、方法、類以及本地變量。一旦你將引用聲明為 final,你將不能改變這個引用了,編譯器會檢查代碼,如果你試圖將變量再次初始化的話,編譯器會報編譯錯誤。

什么是 final 變量

凡是對成員變量或者本地變量(在方法中的或者代碼塊中的變量稱為本地變量)聲明為 final 的都叫做 final 變量。final 變量經常和 static 關鍵字一起使用,作為常量。
下面是 final 變量的例子:

public static final String LOAN = "loan";
LOAN = new String("loan");  // Invalid compilation error 

final 變量是只讀的。

什么是 final 方法

final 也可以聲明方法。方法前面加上 final 關鍵字,代表這個方法不可以被子類重寫。如果你認為一個方法的功能已經足夠完整了,子類中不需要改變的話,你可以聲明此方法為 final。final 方法比非 final 方法要快,因為在編譯的時候已經靜態綁定了,不需要在運行時再動態綁定。
下面是 final 方法的例子:

class PersonalLoan{
  public final String getName(){
    return "personal loan";
  }
}

class CheapPersonalLoan extends PersonalLoan{
  @Override
  public final String getName(){
    return "Chean personal loan"; // Compilation error:overridden method is final
  }
}

什么是 final 類

使用 final 來修飾的類叫做 final 類。final 類通常功能是完整的,他們不能被繼承。Java 中有許多類是 final 的,譬如 String、Integer 以及其他包裝類。
下面是 final 類的示例:

final class PersonalLoan{ }

class CheanPersonalLoan extends PersonalLoan { // Compilation error:cannot inherit form final class  
}

final 關鍵字的好處

下面總結了一些使用 final 關鍵字的好處:

  1. final 關鍵字提高了性能。JVM 和 Java 應用都會緩存 final 變量。
  2. final 變量可以安全的在多線程環境下進行共享,而不需要額外的同步開銷。
  3. 使用 final 關鍵字,JVM 會對方法、變量及類進行優化。

不可變類

創建不可變類要使用 final 關鍵字。不可變類是指它的對象一旦被創建了就不能給更改了。String 是不可變的代表。不可變類有很多好處,譬如:

  • 他們的對象是只讀的。
  • 可以在多線程環境下安全的共享。
  • 不用額外的同步開銷等。

關于 final 的重要知識點

  1. final 關鍵字可以用于成員變量、本地變量、方法以及類。
  2. final 成員變量必須在聲明的時候初始化或者在構造器中初始化,否者就會編譯報錯。
  3. 你不能夠對 final 變量再次賦值。
  4. 本地變量必須在聲明時賦值。
  5. 在匿名類中所有的變量都必須是 final 變量。
  6. final 方法不能被重寫。
  7. final 類不能被繼承。
  8. final 關鍵字不同于 finally 關鍵字,后者用于異常處理。
  9. final 關鍵字容易與 finalize() 方法搞混,后者是在 Object 類中定義的方法,是在垃圾回收之前被 JVM 調用的方法。
  10. 接口中聲明的所有變量本身是 final 的。
  11. final 和 abstract 這兩個關鍵字是反相關的,final 類就不可能是 abstract 的。
  12. final 方法在編譯階段綁定,稱為靜態綁定(static binding)。
  13. 沒有在聲明時初始化 final 變量的稱為空白 final 變量(blank final variable),它們必須在構造器中初始化,或者調用 this() 初始化。不這么的話,編譯器會報錯"final 變量(變量名)需要進行初始化"。
  14. 將類、方法、變量聲明為 final 能夠提高性能,這樣 JVM 就有機會進行估計,然后優化。
  15. 按照 Java 代碼慣例,final 變量就是常量,而通常常量名要大寫:
private final int COUNT = 10;

原文

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 第6章類文件結構 6.1 概述 6.2 無關性基石 6.3 Class類文件的結構 java虛擬機不和包括java...
    kennethan閱讀 967評論 0 2
  • final 關鍵字的含義 final 在 Java 中是一個保留的關鍵字,可以聲明成員變量、方法、類以及本地變量。...
    杰哥長得帥閱讀 605評論 0 0
  • Java關鍵字final 在設計程序時,出于效率或者設計的原因,有時候希望某些數據是不可改變的。這時候可以使用fi...
    獅_子歌歌閱讀 757評論 1 4
  • 恍若隔世是哪樣的感覺。 現在的我清晰而又疑惑的每一天生活工作,認真不留遺憾,卻由于不在父母身邊深感失落。 撿起扣扣...
    半朵格桑花閱讀 394評論 0 0