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

Javaがコンストラクターで静的final変数の初期化を許可しないのはなぜですか?


変数staticおよびfinalを宣言する場合は、宣言時または静的ブロックで初期化する必要があります。コンストラクターで初期化しようとすると、コンパイラーは値を再割り当てしようとしていると見なし、コンパイル時エラーを生成します-

class Data {
   static final int num;
   Data(int i) {
      num = i;
   }
}
public class ConstantsExample {
   public static void main(String args[]) {
      System.out.println("value of the constant: "+Data.num);
   }
}

コンパイル時エラー

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

このプログラムを機能させるには、静的ブロックの最後の静的変数を-

として初期化する必要があります。

class Data {
   static final int num;
   static {
      num = 1000;
   }
}
public class ConstantsExample {
   public static void main(String args[]) {
      System.out.println("value of the constant: "+Data.num);
   }
}

出力

value of the constant: 1000

  1. コンストラクターがJavaでfinalになれない理由

    finalキーワードは、メソッドがオーバーライドされるのを防ぎます。コンストラクターをオーバーライドすることはできません。Javaではコンストラクターをfinalとしてマークすることはできません。

  2. Javaの最終変数

    最終変数は明示的に一度だけ初期化できます。 finalとして宣言された参照変数を、別のオブジェクトを参照するように再割り当てすることはできません。 ただし、オブジェクト内のデータは変更できます。したがって、オブジェクトの状態は変更できますが、参照は変更できません。 変数を使用する場合、最終修飾子 多くの場合、定数をクラス変数にするためにstaticとともに使用されます。 例 public class Test {    final int value = 10;    // The following are examples of declaring