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

Javaの定数とfinal変数の違いとは?static finalの正しい使い方を解説

Javaにおける定数(Constant)とは

定数とは、値が固定されており、プログラム内にそのコピーが1つだけ存在する変数のことです。定数として宣言し、一度値を代入すると、以降はプログラムのどこであってもその値を変更することはできません。

C言語と異なり、Javaでは定数を直接サポートしていません。しかし、変数をstaticfinalの両方で宣言することで、定数を作成することが可能です。

  • staticを付けて宣言すると、その変数はコンパイル時にメモリへロードされます。つまり、プログラム全体でコピーは1つだけしか存在しません。
  • finalを付けて宣言すると、その変数の値を再度変更することができなくなります。

コード例

class Data {
   static final int integerConstant = 20;
}
public class ConstantsExample {
   public static void main(String args[]) {
      System.out.println("integerConstantの値: "+Data.integerConstant);
   }
}

実行結果

integerConstantの値: 20

Javaにおけるfinal変数とは

変数にfinalを付けると、その値を変更できなくなります。もし値を再代入しようとすると、コンパイル時エラーが発生します。

コード例

public class FinalExample {
   public static void main(String args[]) {
      final int num = 200;
      num = 2544;
   }
}

実行結果

FinalExample.java:4: error: cannot assign a value to final variable num
   num = 2544;
   ^
1 error

final変数と定数の主な違い

final変数と定数(static final)の最大の違いは、staticキーワードを付けずにfinal変数を作成した場合です。この場合、変数の値は変更不可であるものの、新しいオブジェクトを生成するたびに、その変数のコピーが個別に作成されます。

一方、定数は変更不可であり、かつプログラム全体を通してコピーは1つしか存在しません。

次のJavaプログラムで確認してみましょう。

コード例

class Data {
   final int integerConstant = 20;
}
public class ConstantExample {
   public static void main(String args[]) {
      Data obj1 = new Data();
      System.out.println("integerConstantの値: "+obj1.integerConstant);
      Data obj2 = new Data();
      System.out.println("integerConstantの値: "+obj2.integerConstant);
   }
}

実行結果

integerConstantの値: 20
integerConstantの値: 20

この例では、final変数を作成し、2つの異なるオブジェクトからその値を出力しています。どちらの出力も同じ「20」に見えますが、実際には各オブジェクトごとに独立したコピーが存在しています。

定数の定義上、変数はプログラム(クラス)全体で単一のコピーを持つ必要があります。したがって、定義に厳密に従った定数を作成するには、変数をstaticとfinalの両方で宣言しなければなりません。

まとめ

項目final変数のみstatic final(定数)
値の変更不可不可
コピーの数オブジェクトごとに1つずつ生成されるプログラム全体で1つのみ
メモリへのロードオブジェクト生成時クラスロード時(コンパイル時)

値の固定だけが必要ならfinal変数で十分ですが、プログラム全体で共有される真の定数が必要な場合は、必ず「static final」を組み合わせて宣言しましょう。

  1. JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介

    HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って

  2. Javaの定数とは?finalキーワードを使った定義方法を徹底解説

    定数とは何か定数(constant)とは、一度値を代入すると、その後変更することができない変数のことです。Javaには定数を直接扱うための組み込み機能は用意されていませんが、「final」キーワードを使うことで簡単に定数を実現できます。定数を使うメリット定数を活用することで、プログラムの意図が明確になり、コードの可読性が大きく向上します。他の開発者がコードを読んだときにも、値が変わらないことが保証されているため、理解しやすくなります。さらに、定数はJVM(Java Virtual Machine)やアプリケーションによってキャッシュされるため、パフォーマンスの向上にもつながります。finalキ