静的メンバー変数は静的ブロックでのみ操作できます。また、コンストラクターを複数回呼び出しても、静的ブロックはJVMで 1 回しか実行されないことを通知します。
なぜ静的ブロックが必要なのですか? コンストラクター内でstatic finalメンバー変数を初期化できないため、意味がありません。
したがって、静的変数はインスタンスごとに作成されるため、コンストラクターで初期化できます。また、静的ブロック内で静的最終変数を初期化する必要があります。非最終静的メンバー変数の初期化は、静的ブロック内に記述できるかどうかのいずれかであり、それは選択です。作成時に各インスタンスで同じ値を初期化したい場合は、コンストラクタ内で静的変数を割り当てて静的変数をリセットします。静的変数を一度だけ設定したい場合は、それが最終メンバー変数でなくても、静的ブロック内に init ステートメントを記述する必要があります。
これは簡単なデモです。
A - 静的初期化ブロックを含むサンプル モデル クラス
public class SampleModel {
private int index; // Will be init within the constructor
private static final int MAX_VALUE; // Will be init within static block
private static String messageOfTheDay; // Will be init within static block
// Argument Constructor
public SampleModel(int index) {
this.index = index;
System.out.println("Constructor called");
}
// static block, will be run only once!
static {
System.out.println("WARNING: Static Block called !");
MAX_VALUE = 69;
messageOfTheDay = "I'm here";
}
public String getMessageOfTheDay() {
return messageOfTheDay;
}
public int getMaxValue() {
return MAX_VALUE;
}
public int getIndex() {
return index;
}
}
B - デモコード
public class StaticBlockDemo {
public static void main(String[] args) {
SampleModel obj1 = new SampleModel(1);
SampleModel obj2 = new SampleModel(2);
SampleModel obj3 = new SampleModel(3);
System.out.println();
System.out.println( "obj1 : index : " + obj1.getIndex() );
System.out.println( "obj1 : Max Value: " + obj1.getMaxValue() );
System.out.println( "obj1 : Max MOTD : " + obj1.getMessageOfTheDay() + "\n");
System.out.println( "obj2 : index : " + obj2.getIndex() );
System.out.println( "obj2 : Max Value: " + obj2.getMaxValue() );
System.out.println( "obj2 : Max MOTD : " + obj2.getMessageOfTheDay() + "\n");
System.out.println( "obj3 : index : " + obj3.getIndex() );
System.out.println( "obj3 : Max Value: " + obj3.getMaxValue() );
System.out.println( "obj3 : Max MOTD : " + obj3.getMessageOfTheDay() + "\n");
}
}
C - 出力
WARNING: Static Block called !
Constructor called
Constructor called
Constructor called
obj1 : index : 1
obj1 : Max Value: 69
obj1 : Max MOTD : I'm here
obj2 : index : 2
obj2 : Max Value: 69
obj2 : Max MOTD : I'm here
obj3 : index : 3
obj3 : Max Value: 69
obj3 : Max MOTD : I'm here
出力では、コンストラクターは 3 回呼び出されますが、静的ブロックは 1 回しか呼び出されないことを通知します。