Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのfinal変数はオブジェクト生成時に初期化できる?4つの初期化方法を解説


final変数の初期化は必須

Javaで変数をfinalとして宣言すると、一度値を初期化した後は、その値を変更することができません。また、通常のインスタンス変数と異なり、final変数にはデフォルト値(0 や null など)が自動的に代入されない点にも注意が必要です。

そのため、final変数は宣言した時点で必ず初期化しなければなりません。初期化せずに使用すると、コンパイルエラーが発生します。

初期化忘れによるコンパイルエラーの例

public class FinalExample {
    final int j;
    public static void main(String args[]){
        FinalExample obj = new FinalExample();
        System.out.println(obj.j);
    }
}

コンパイルエラー

FinalExample.java:5: error: variable j might not have been initialized
        System.out.println(obj.j);
                           ^
1 error

final変数を初期化する4つの方法

final変数は、次の4つの方法で初期化できます。

1. 宣言と同時に初期化する

最もシンプルな方法です。宣言文の中で直接値を代入します。

public class FinalExample {
    final int j = 100;
    public static void main(String args[]){
        FinalExample obj = new FinalExample();
        System.out.println(obj.j);
    }
}

実行結果

100

2. メソッドを使って初期化する

メソッドの戻り値を使ってfinal変数を初期化することも可能です。

import java.util.Scanner;
public class FinalExample {
    final int num = getNum();
    public static final int getNum() {
        System.out.println("数値を入力してください");
        return new Scanner(System.in).nextInt();
    }
    public static void main(String args[]){
        FinalExample obj = new FinalExample();
        System.out.println(obj.num);
    }
}

実行結果

数値を入力してください
20
20

3. コンストラクタを使って初期化する

オブジェクトごとに異なる値を設定したい場合は、コンストラクタ経由での初期化が便利です。

public class FinalExample {
    final int num;
    public FinalExample(int num) {
        this.num = num;
    }
    public static void main(String args[]){
        FinalExample obj = new FinalExample(20);
        System.out.println(obj.num);
    }
}

実行結果

20

4. インスタンス初期化ブロックを使って初期化する

複数のコンストラクタで共通の初期化処理を行いたい場合に有効な方法です。

public class FinalExample {
    final int num;
    {
        num = 500;
    }
    public static void main(String args[]){
        FinalExample obj = new FinalExample();
        System.out.println(obj.num);
    }
}

実行結果

500

まとめ

メソッドを使って初期化する場合を除き、残りの3つの方法(宣言時・コンストラクタ・インスタンス初期化ブロック)で初期化されたfinal変数は、クラスをインスタンス化した時点で値が確定します。final変数を扱う際は、「宣言と同時に必ず初期化する」ことを意識しておきましょう。


  1. Javaのpack()メソッドとは?使い方とsetSize()との違いを解説

    pack()メソッドは、JavaのWindowクラスで定義されているメソッドで、フレーム内のすべてのコンポーネントがそれぞれの推奨サイズ(preferred size)以上で表示されるように、ウィンドウのサイズを自動的に調整します。 代替手段として、setSize()メソッドやsetBounds()メソッドを呼び出して、フレームのサイズを明示的に指定する方法もあります。しかし一般的には、pack()メソッドを使用する方がsetSize()よりも推奨されています。その理由は、pack()がフレームのサイズ決定をレイアウトマネージャーに委ねることができ、レイアウトマネージャーはプラットフォーム間の

  2. Javaのfinal変数とは?使い方と定数宣言の基本を解説

    Javaにおけるfinal変数は、明示的な初期化を一度しか行えない変数です。一度値を代入すると、その後は再代入することができません。 また、参照型変数にfinalを付けた場合、その参照先のオブジェクトを別のオブジェクトに変更することはできません。ただし、オブジェクト内部のデータ(フィールドの値など)は変更可能です。つまり、オブジェクトの状態は変更できるが、参照自体は変更できないという点に注意が必要です。 final修飾子とstaticの組み合わせ 変数に対してfinal修飾子を使用する場合、多くの場面でstaticキーワードと組み合わせて使われます。これにより、定数がクラス変数(クラス全体で共