1. 程式人生 > >Java教程35—Java中的final關鍵字用法

Java教程35—Java中的final關鍵字用法

在本教程中,我們將學習final關鍵字的用法。
final關鍵字可以與變數,方法和類一起使用。
我們將詳細介紹以下主題。

  • 1)final變數
  • 2)final方法
  • 3)final變數

1)final變數

final變數是常量。
初始化後,我們無法更改final變數的值。
讓我們看看下面的程式碼:

class Demo{
    final int MAX_VALUE=99;
    void myMethod(){
        MAX_VALUE=101;
    }
    public static void main(String args[]){
        Demo obj=new  Demo();
        obj.myMethod();
    }
}
Output:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The final field Demo.MAX_VALUE cannot be assigned
at beginnersbook.com.Demo.myMethod(Details.java:6)
at beginnersbook.com.Demo.main(Details.java:10)

我們在上面的程式中遇到了編譯錯誤,因為我們試圖修改final變數“MAX_VALUE”的值。

注意:常量名稱使用大寫被認為是一種好習慣。


空白的final變數
在宣告時未初始化的final變數稱為空白final變數。
我們必須在類的建構函式中初始化空白的final變數,否則會丟擲一個編譯錯誤(錯誤:變數MAX_VALUE可能尚未初始化)。

這是在類中使用空白final變數的方式:

class Demo{
    //空白final變數  未初始化
    final int MAX_VALUE;

    Demo(){
        //必須在建構函式中初始化
        MAX_VALUE=100;
    }
    void myMethod(){
        System.out.println(MAX_VALUE);
    }
    public static void main(String args[]){
        Demo obj=new  Demo();
        obj.myMethod();
    }
}

Output:
100

什麼是空白的final變數?
假設我們有一個Student類,其中有一個名為Roll_No的成員變數。
由於Roll_No不應該在學生註冊後更改,我們可以將其宣告為類中的final變數。
但我們無法提前初始化ROLL_NO學生們(否則所有學生都會有相同的卷號)。
在這種情況下,我們可以宣告ROLL_NO變數為空白final,我們在物件構造期間初始化此值,如下所示:

class StudentData{
    //Blank final variable
    final int ROLL_NO;

    StudentData(int rnum){
        //必須建構函式中初始化
        ROLL_NO=rnum;
    }
    void myMethod(){
        System.out.println("Roll no is:"+ROLL_NO);
    }
    public static void main(String args[]){
        StudentData obj=new  StudentData(1234);
        obj.myMethod();
    }
}
Output:

Roll no is:1234

未初始化的靜態final變數
宣告期間未初始化的靜態final變數只能在靜態塊中初始化。例:

class Example{
    //static 未初始化final變數 
    static final int ROLL_NO;
    static{
        ROLL_NO=1230;
    }
    public static void main(String args[]){
        System.out.println(Example.ROLL_NO);
    }
}
Output:

1230

2)final方法

無法覆蓋final方法。
這意味著即使子類雖然呼叫父類的final方法沒有任何問題,但是不能覆蓋它。

例:

class XYZ{
    final void demo(){
        System.out.println("XYZ Class Method");
    }
}

class ABC extends XYZ{
    void demo(){
        System.out.println("ABC Class Method");
    }

    public static void main(String args[]){
        ABC obj= new ABC();
        obj.demo();
    }
}

上面的程式會丟擲一個編譯錯誤,但是我們可以在子類中使用父類final方法而不會出現任何問題。


讓我們來看看這段程式碼:這個程式執行正常,因為我們沒有覆蓋final方法。
這表明final方法是可以繼承下來的,但它們不符合覆蓋的條件。

class XYZ{
    final void demo(){
        System.out.println("XYZ Class Method");
    }
}

class ABC extends XYZ{
    public static void main(String args[]){
        ABC obj= new ABC();
        obj.demo();
    }
}
Output:

XYZ Class Method

3) final class

不能繼承一個final類.
如下示例:

final class XYZ{
}

class ABC extends XYZ{
    void demo(){
        System.out.println("My Method");
    }
    public static void main(String args[]){
        ABC obj= new ABC();
        obj.demo();
    }
}

Output:

The type ABC cannot subclass the final class XYZ

要點總結

  • 1)建構函式不能被宣告為final。
  • 2)本地final變數必須在宣告期間初始化。
  • 3)在介面中宣告的所有變數預設為final。
  • 4)我們不能改變final變數的值。
  • 5)不能覆蓋final方法。
  • 6)final類不得繼承。
  • 7)如果方法引數被宣告為final,則不能更改這些引數的值。
  • 8)在大寫命名final變數是一個好習慣。
  • 9)final, finally 和 finalize確定是三個不同的術語。finally用於異常處理,finalize是JVM在呼叫期間呼叫的方法垃圾收集。

原文地址:

https://beginnersbook.com/2014/07/final-keyword-java-final-variable-method-class/