1. 含義
- 在不同使用場景下率翅,有細微的區(qū)別,總體是指的是"這是不可變的"
- final的保留關鍵字,可以聲明成員變量(實例變量,屬性)、本地變量(局部變量)昔字、方法银觅、類
- 引用聲明為final,則不能改變這個引用,不能再次初始化
- final 合理運用可以改善性能
- final變量是只讀的(對于非引用類型)
2. 修飾變量
- 使用final修飾變量,只能進行一次賦值操作,并且在生存周期內不可以改變它的值
- final修飾的變量,可以不在聲明時賦值,即可以先聲明,后賦值
- final修飾基本類型時,其值不能改變
- final修飾成員變量,可以賦值的地方,一是聲明時就賦值,二是在構造方法方法
- 類變量可以在靜態(tài)塊中賦值或聲明時賦值
- final修飾引用類型時践宴,不能再次初始化,即限定了引用變量的引用(內存地址)不可改變鲸匿,但引用對象的值是可以改變的
- 同時使用static和final修飾成員在內存中只占據(jù)一段不能改變的存儲空間
代碼示例如下:
class Value {
int v;
public Value(int v) {
this.v = v;
}
}
public class FinalTest {
final int f1 = 1;
final int f2;
public FinalTest() {
f2 = 2;
}
public static void main(String[] args) {
final int value1 = 1;
// value1 = 4;
final double value2;
// value2 只能賦值一次
value2 = 2.0;
final Value value3 = new Value(1);
// value3中v的值可以變
value3.v = 4;
}
}
3. 修飾方法參數(shù)
- 在方法的聲明中,在參數(shù)前添加final關鍵字
- 表示在整個方法中阻肩,都不能改變參數(shù)的值或引用
- 如果方法聲明參數(shù)類型為基本類型带欢,則表示其值不能改變
- 如果方法聲明參數(shù)類型為引用類型,則表示其引用不能改變,但引用對象的值可以改變
代碼示例
public class FinalTest {
/* ... */
public void finalFunc(final int i, final Value value) {
// i = 5; 不能改變i的值
// v = new Value(); 不能改變v的值
value.v = 5; // 可以改變引用對象的值
}
}
4. 修飾方法
- 修飾方法表示該方法不能被覆蓋
- 類中所有的private方法都隱式地指定為是final的
- 設計角度理解烤惊,即明確告訴其他可能會繼承該類的程序員乔煞,不希望去覆蓋這個方法
- final方法比非final方法要快,編譯時已經靜態(tài)綁定,不需要在運行時再動態(tài)綁定
5. 修飾類
- final修飾的類是無法被繼承的
- JDK很多類都final的,如String,Integer以及其他包裝類
- 不可變類一旦被創(chuàng)建就不能再更改
- 不可變類好處:
- 對象是只讀的
- 可以在多線程環(huán)境下安全的共享
- 不用額外的同步開銷
6. 優(yōu)點
- final關鍵字提高了性能
- JVM和java應用都會緩存final變量
- final變量可以在安全的在多線程環(huán)境中共享,而不需要額外的同步開銷
- 使用final關鍵字,JVM會對方法、變量及類進行優(yōu)化
7. 要點
- final關鍵字可以用于成員變量柒室、本地變量渡贾、方法以及類。
- final成員變量必須在聲明的時候初始化或者在構造器中初始化伦泥,否則就會報編譯錯誤剥啤。
- 你不能夠對final變量再次賦值。
- 本地變量必須在聲明時賦值不脯。
- 在匿名類中所有變量都必須是final變量府怯。
- final方法不能被重寫。
- final類不能被繼承防楷。
- final關鍵字不同于finally關鍵字牺丙,后者用于異常處理。
- final關鍵字容易與finalize()方法搞混复局,后者是在Object類中定義的方法冲簿,是在垃圾回收之前被JVM調用的方法。
- 接口中聲明的所有變量本身是final的亿昏。
- final和abstract這兩個關鍵字是反相關的峦剔,final類就不可能是abstract的。
- final方法在編譯階段綁定角钩,稱為靜態(tài)綁定(static binding)吝沫。
- 沒有在聲明時初始化final變量的稱為空白final變量(blank final variable),它們必須在構造器中初始化递礼,或者調用this()初始化惨险。不這么做的話,編譯器會報錯“final變量(變量名)需要進行初始化”脊髓。
- 將類辫愉、方法、變量聲明為final能夠提高性能将硝,這樣JVM就有機會進行估計恭朗,然后優(yōu)化屏镊。
- 按照Java代碼慣例,final變量就是常量冀墨,而且通常常量名要大寫:
private final int COUNT = 10;
- 對于集合對象聲明為final指的是引用不能被更改闸衫,但是你可以向其中增加,刪除或者改變內容诽嘉。
private final List Loans = new ArrayList();
list.add(“home loan”); //valid
list.add("personal loan"); //valid
loans = new Vector(); //not valid