JAVA中Final的用法


1.         修飾基礎數據成員的final

這是final的主要用途,其含義相當於C/C++的const,即該成員被修飾為常量,意味着不可修改。如java.lang.Math類中的PI和E是final成員,其值為3.141592653589793和2.718281828459045。

2.         修飾類或對象的引用的final

在Java中,我們無法讓對象被修飾為final,而只能修飾對象的引用,這意味着即使你寫public final A a = new A(); 事實上a指向的對象的數據依然可以被修改,不能修改的是a本身的引用值,即你不能再對a進行重賦值。同樣的情況出現在數組中,比如public final int[] a = {1, 2, 3, 4, 5},事實上a中的數值是可修改的,即可以寫a[0] = 3。據目前了解,java中數組內的數據是無法修飾為不可修改的,而C/C++可以。

3.         修飾方法的final

修飾方法的final和C/C++中修飾成員對象的const大不相同。首先,修飾方法的final含義不是“不可修改”,而是指該方法不可被繼承成員重新定義。(注意,這里所說的不能被重新定義,並不是指子類一定不能定義同名方法,如果父類的方法是私有類型,子類是允許定義該方法的,這里指的不能重新定義是指不能通過改寫方法來使得方法重寫的多態性得以實現,如不希望A a = new B(); a.f();這樣的重寫方法情況出現)

示例:

public class A {

    // final方法f

    public final void f() {

       System.out.println("類A中的final方法f被調用了");

    }

}

public class B extends A {

    // 編譯錯誤!父類的f方法是final類型,不可重寫!

    //! public void f() {

    //!     System.out.println("類B中的方法f被調用了");

    //! }

}

此外,當一個方法被修飾為final方法時,意味着編譯器可能將該方法用內聯(inline)方式載入,所謂內聯方式,是指編譯器不用像平常調用函數那樣的方式來調用方法,而是直接將方法內的代碼通過一定的修改后copy到原代碼中(將方法主體直接插入到調用處,而不是進行方法調用)。這樣可以讓代碼執行的更快(因為省略了調用函數的開銷),比如在int[] arr = new int[3]調用arr.length()等。

另一方面,私有方法也被編譯器隱式修飾為final,這意味着private final void f()和private void f()並無區別。

4.         修飾類的final

當一個類被修飾為final時,它的含義很明確,就是不允許該類被繼承,也就是說,該類“絕后”了,任何繼承它的操作都會以編譯錯誤告終。這也凸顯出Java用final而不用const作為標識符的理由。(成員變量可以不是final,成員方法直接是final的)

       示例:

       public final class A {

}

// 編譯錯誤!A是final類型,不可被繼承!

//!public class B extends A{

//!}

5.                        參數final

 

 對對象參數做final修飾。以為對象變量傳遞的是其引用,為防止調用過程中無意的更改而修飾。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM