Java finalキーワード - 定数宣言

finalキーワード

Javaプログラムにおけるfinalは、最後として宣言されたため修正できないという意味です。つまり、finalが付けられた要素は初期化後に修正できません。

finalは変数、メソッド、クラスに付けることができ、どの位置に宣言されるかによって機能が変わります。

宣言される位置 説明
Variable 変数のデータを定数化するために使用し、値の変更ができなくなります。
Method overridingができなくなります。
Class 継承ができなくなります。

final変数

final データ型 変数名 = ;

finalが付けられると、変数は定数になります。定数は変わらない値を意味し、定数として宣言した変数は値を変更できません。

定数名は慣例的に英大文字とアンダースコア(_)で宣言します。この規則は構文規則ではありませんが、一般的な命名に従うことはコードの可読性という観点でも重要です。たとえば、次は文字列型定数GREETING_MSGを宣言する例です。

final String GREETING_MSG = "Hello World! Java.";

finalオブジェクト変数の場合

オブジェクト変数の場合、フィールドは変更できますが、オブジェクト変数に新しいオブジェクトを生成して割り当てることはできません。

class SampleClass {     
    int a;  
}

public final class FinalSample {        
    public static void main(String[] args) {    
        final int RESULT = 10;
        RESULT++;
 
        final SampleClass SAMPLE = new SampleClass();
        SAMPLE.a = 10;
        SAMPLE.a = 15;
 
        SAMPLE = new SampleClass(); // オブジェクトを新しく生成して割り当てることはできません。
 
    }   
}

finalグローバル変数の場合

通常はグローバル変数として、finalstaticキーワードを組み合わせ、複数の場所で共有する固定値を指定して使用します。

public class FinalSample {      
    final int INDEX_LIMIT = 100;    
 
    public void display() { 
        System.out.println(INDEX_LIMIT);
        int[] arr = new int[INDEX_LIMIT];
        INDEX_LIMIT = 1005; // Error: 値を再代入できません。
    }   
}

final引数の場合

引数にもfinalを宣言できます。宣言すると、その引数は使用されるメソッド内で値を再代入できなくなります。

public final class FinalSample {        
    public void finalTestMethod(final int a) {
        a = 10; // Error: 値を再代入できません。
    }   
}

finalメソッド

finalメソッドは、継承された子クラスで再定義(overriding)できません。

class FinalMethodTest {
    int result = 10;    
    public final void printResult() {
        System.out.println(result);
    }
}

public class ExampleClass extends FinalMethodTest {
    @Override   
    public final void printResult() { // Error: オーバーライドできません。
 
    }
}       

finalクラス

クラスにfinalを付けて作成すると、そのクラスは継承できません。finalは、変数やメソッドを再定義すると機能が正常に動作しないクラスに付けて使用します。

final class ExtendTest {    
    int a;
}

public class ExampleClass extends ExtendTest { // Error: ExtendTestを継承できません。
    public static void main(String[] args) {
 
    }
}