天天看點

【Java】final關鍵字

前言

Java中的關鍵字

final

的含義通常為“這是無法改變的”。下面将介紹final用于修飾資料、方法和類的這三種情況。

final資料

許多程式設計語言都有某種方法,來向告訴編譯器這一塊資料是不變的。有時候資料的恒定不變會很有用,比如編譯時常量或者一個在運作時被初始化的值而你不希望改變它。對于編譯期常量,編譯器可以将該常量代入任何可能用到它的計算式中,也就是說,可以在編譯時執行計算式,這将減輕運作時的負擔。

一個既有static又有final修飾的域将占據一段不能改變的存儲空間,這個域表示編譯時常量,類似于C++中使用const關鍵字修飾的常量。

static final int MAX_NUM = 9999;	//預設既是static又是final修飾的域使用大寫
           

當final修飾的不是基本資料類型而是對象的引用時,這時候要做好區分。

當修飾基本資料類型時,是表示數值恒定不變;當修飾對象引用時,表示引用恒定不變。即,一旦引用初始化執行一個對象後,便不可以使它指向另外一個引用。但所指向的對象自身确實可以被改變的。

空白fiinal

空白final

是指聲明為final但又未給定初始值的域。但是,無論在什麼情況下,編譯器都得確定空白final在使用前必須被初始化。空白final在關鍵字final的使用上提供了更大的靈活性,一個類中的final域就可以根據對象而有所不同,但又保持其恒定不變的特性。

空白final要在使用前確定被初始化,那麼怎麼才能確定呢?看下面這個簡單的例子(參考[1]):

class Poppet{
    private int i;
    Poppet(int ii){ i = ii;}
}

public class BlankFinal{
    private final int i = 0;	//在定義時就初始化
    private final int j;	//空白final
    private final Poppet p;	//空白final引用
    public BlankFinal(){	//在構造器中必須初始化空白final域或引用
        j = 1;
        p = new Poppet(1);
    }
    public static void main(String args[]){
        new BlankFinal();
    }
} 
           

確定在使用空白final之前将其初始化的手段在于:必須在域的定義處或者每個構造器中用表達式對final進行指派。

final參數

在參數清單中使用final去修飾參數,将意味着你在方法中将無法更改參數引用所指向的對象。

final方法

使用final方法的原因有兩個。第一個是将方法鎖定,以防止任何繼承類修改它的含義。這是出于設計的考慮:想要確定在繼承中使用方法行為保持不變,并且不會被覆寫。第二個原因是效率,但是在Java SE5/6後,都應該讓編譯器和JVM處理效率問題。是以,隻有要明确禁止覆寫時,才将方法設定為final的。

final和private關鍵字

類中所有的private方法都隐式地指定為final的。由于無法取用到private方法,是以也就無法覆寫它。可以給private方法添加final修飾詞但是這并沒有任何意義。

final類

當将某個類整體定義為final時,就表明你不想該類被繼承,該類就是一個終結類。final類中的所有方法都隐式地指定為final的,是以無法覆寫它們。

小結

本篇博文簡要記述了Java的final關鍵字的使用,注意使用細節問題。

參考:

[1] Eckel B. Java程式設計思想(第四版)[M]. 北京: 機械工業出版社, 2007

每天進步一點點,不要停止前進的腳步~