Вы можете работать только со статическими переменными-членами с статическим блоком . И обратите внимание, что даже если вы вызываете конструктор несколько раз, статический блок будет запускаться только один раз на JVM .
Зачем нам нужен статический блок ? Поскольку мы не можем инициализировать переменные static final в конструкторе, это не имеет никакого смысла.
Итак, вы можете инициировать ваши статические переменные с помощью Constructor, потому что они создаются для каждого экземпляра. И вы должны инициировать ваши статические конечные переменные в статическом блоке. Инициализация не финальных статических переменных-членов либо может быть записана внутри статического блока, либо нет, это выбор. Вы можете захотеть инициировать одно и то же значение в каждом экземпляре при создании, а затем назначить статическую переменную в конструкторе для сброса статической переменной. Если вы просто хотите установить статическую переменную один раз, то даже если она не является конечной переменной-членом, вы должны написать инструкцию 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 раза, однако статический блок вызывается только один раз.