概述
Java 中的 final 關(guān)鍵字非常重要打瘪,它可以應(yīng)用與類幼苛、方法以及變量
。這篇文章中我將帶你看看:
- 什么是 final 關(guān)鍵字?
- 將變量滨巴、方法和類聲明為 final 代表了什么?
- 使用 final 的好處是什么惠遏?
最后也有一些使用 final 關(guān)鍵字的實(shí)例机打。final 經(jīng)常和 static 一起使用來聲明常量,你也會(huì)看到 final 是如何改善應(yīng)用性能的猿棉。
final 關(guān)鍵字的含義
final 在 Java 中是一個(gè)保留的關(guān)鍵字磅叛,可以聲明成員變量、方法萨赁、類以及本地變量
弊琴。一旦你將引用聲明為 final,你將不能改變這個(gè)引用了杖爽,編譯器會(huì)檢查代碼敲董,如果你試圖將變量再次初始化的話,編譯器會(huì)報(bào)編譯錯(cuò)誤慰安。
什么是 final 變量
凡是對成員變量或者本地變量(在方法中的或者代碼塊中的變量稱為本地變量
)聲明為 final 的都叫做 final 變量腋寨。final 變量經(jīng)常和 static 關(guān)鍵字一起使用,作為常量化焕。
下面是 final 變量的例子:
public static final String LOAN = "loan";
LOAN = new String("loan"); // Invalid compilation error
final 變量是只讀的萄窜。
什么是 final 方法
final 也可以聲明方法。方法前面加上 final 關(guān)鍵字,代表這個(gè)方法不可以被子類重寫查刻。如果你認(rèn)為一個(gè)方法的功能已經(jīng)足夠完整了番宁,子類中不需要改變的話,你可以聲明此方法為 final赖阻。final 方法比非 final 方法要快蝶押,因?yàn)樵诰幾g的時(shí)候已經(jīng)靜態(tài)綁定了,不需要在運(yùn)行時(shí)再動(dòng)態(tài)綁定棋电。
下面是 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 關(guān)鍵字的好處
下面總結(jié)了一些使用 final 關(guān)鍵字的好處:
- final 關(guān)鍵字提高了性能烘浦。JVM 和 Java 應(yīng)用都會(huì)緩存 final 變量萍鲸。
- final 變量可以安全的在多線程環(huán)境下進(jìn)行共享,而不需要額外的同步開銷脊阴。
- 使用 final 關(guān)鍵字握侧,JVM 會(huì)對方法、變量及類進(jìn)行優(yōu)化嘿期。
不可變類
創(chuàng)建不可變類要使用 final 關(guān)鍵字品擎。不可變類是指它的對象一旦被創(chuàng)建了就不能給更改了。String 是不可變的代表萄传。不可變類有很多好處,譬如:
- 他們的對象是只讀的盲再。
- 可以在多線程環(huán)境下安全的共享。
- 不用額外的同步開銷等。
關(guān)于 final 的重要知識點(diǎn)
- final 關(guān)鍵字可以用于成員變量贷揽、本地變量、方法以及類蓖救。
- final 成員變量必須在聲明的時(shí)候初始化或者在構(gòu)造器中初始化洪规,否者就會(huì)編譯報(bào)錯(cuò)循捺。
- 你不能夠?qū)?final 變量再次賦值。
- 本地變量必須在聲明時(shí)賦值从橘。
- 在匿名類中所有的變量都必須是 final 變量。
- final 方法不能被重寫叉谜。
- final 類不能被繼承踩萎。
- final 關(guān)鍵字不同于 finally 關(guān)鍵字,后者用于異常處理香府。
- final 關(guān)鍵字容易與 finalize() 方法搞混,后者是在 Object 類中定義的方法企孩,是在垃圾回收之前被 JVM 調(diào)用的方法。
- 接口中聲明的所有變量本身是 final 的工禾。
- final 和 abstract 這兩個(gè)關(guān)鍵字是反相關(guān)的蝗柔,final 類就不可能是 abstract 的闻葵。
- final 方法在編譯階段綁定,稱為靜態(tài)綁定(static binding)槽畔。
- 沒有在聲明時(shí)初始化 final 變量的稱為空白 final 變量(blank final variable)胁编,它們必須在構(gòu)造器中初始化,或者調(diào)用 this() 初始化嬉橙。不這么的話,編譯器會(huì)報(bào)錯(cuò)"final 變量(變量名)需要進(jìn)行初始化"市框。
- 將類、方法喻圃、變量聲明為 final 能夠提高性能,這樣 JVM 就有機(jī)會(huì)進(jìn)行估計(jì)斧拍,然后優(yōu)化。
- 按照 Java 代碼慣例肆汹,final 變量就是常量,而通常常量名要大寫:
private final int COUNT = 10;