淺談Java Final關鍵字

1.概述

Final關鍵字,顧名思義,就是不可更改的,這一定正確嗎?final可以修飾變量,方法,類,那使用過程中有哪些特點呢?

2.爲什麼使用Final關鍵字

  • 提高效率
  • 避免更改

3.如何使用Final關鍵字

final可以修飾變量,方法,類

1.Final變量
final修飾變量,我們希望它達到如下目的。final編譯期決定的值,永遠不會變。final運行期初始化決定的值,我們不希望它改變。

  • final修飾基本數據類型:必須提供初始值,編譯器將其封裝到需要計算的過程裏面,計算可在編譯期提前執行,進而提高效率。

  • final修飾的對象:不必提供初始值,但是在構造函數裏面對其進行初始化。但可以對對象的內容進行修改,也就是說final的只是對象的引用句柄,引用指向的內容還是可以修改的。

  • static final和final的區別:這兩者的區別是很細微的,只有在運行期初始化final才能夠看出來。
    例子:

public class FinalData {
    final int i4 = (int)(Math.random()*10);
    static final int i5 = (int)(Math.random()*10);

    public void print(String id) {
        System.out.println(id + ": " + "i4 = " + i4 + ", i5 = " + i5);
    }

    public static void main(String[] args) {
        FinalData fd1 = new FinalData();
        fd1.print("fd1");
        FinalData fd2 = new FinalData();
        fd2.print("fd2");
    }

}

運行結果:

fd1: i4 = 8, i5 = 6
fd2: i4 = 8, i5 = 6

對於變量i5,因爲它是static的,因此它在載入時初始化,屬於某個類,而非每創建一個對象時初始化。因此i5保持不變,i4會改變。

2. Final方法
使用final方法兩大目的:

  • 避免複寫方法:
    給方法上鎖,避免方法被子類改變,複寫,不想改變方法的語義,即該方法不可覆蓋。

  • 提高效率:
    final方法默認會被編譯器編入具體的調用代碼塊中去,而不是普通方法(自變量壓棧,跳至相應代碼塊,跳回來,清除壓棧的自變量,處理返回值)。這樣可以避免方法調用時候的開銷。但如果該方法體體積很大,效率也沒怎麼提高。private方法自動被編譯器處理爲final,因爲無法訪問一個private方法,那就final吧!
    另外,java編譯器不爲final方法實現動態綁定,進而進一步爲final方法調用生成更高效率代碼。

3. Final類
希望該類不被繼承,不被修改,涉及該類的對象操作儘可能快。

總結

匿名內部類的方法參數必須是final的
final的值可以在運行期決定
final修飾基本類型不能修改,final修飾對象,對象句柄不可改,對象內容可以改。(類似數組?)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章