Основы Java: статическая функция без имени, или возвращаемого типа
public class Main {
public static final Logger LOGGER = Logger.getLogger(Main.class.getName());
static {
try {
LOGGER.addHandler(new FileHandler("errors.log",true));
}
catch(IOException ex) {
LOGGER.log(Level.WARNING,ex.toString(),ex);
}
}
...
Мне интересно, что это за безымянная статическая функция.
Я никогда не видел ничего подобного в java (который я сейчас изучаю).
что это ?
когда он обычно используется ?
когда это будет выполнено в программе ?
6 ответов
Это называется статическим блоком и будет выполняться только один раз во время инициализации. Кроме того, если имеется несколько статических блоков инициализации, время выполнения гарантирует, что они будут вызываться в том порядке, в котором они отображаются в исходном коде.
здесь является довольно хорошее объяснение с примером кода. https://www.geeksforgeeks.org/g-fact-79/
он выполняется один раз при загрузке класса. В этом конкретном случае он устанавливает регистратор для приложения.
вы можете работать только со статическими переменными-членами с статический блок. И сообщите, что даже вы называете конструктор несколько раз статический блок будет работать только один раз на JVM.
зачем нужны статический блок ? Потому что мы не можем инициализировать наш статические заключительные переменные-члены в конструкторе, это не имеет никакого смысла.
таким образом, вы можете инициализировать статические переменные Конструктор, потому что они создаются для каждого экземпляра. И вы должны ввести свои статические конечные переменные в статический блок. Инициализация не конечных статических переменных-членов либо может быть записана внутри статического блока, либо нет, это выбор. Вы можете ввести одно и то же значение в каждом экземпляре при создании, а затем назначить статическую переменную в конструкторе для сброса статической переменной. Если вы просто хотите установить статическую переменную один раз, то даже если она не является конечным членом переменная, затем вы должны написать инструкцию 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-Demo Code
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 раза, однако статический блок вызывается только один раз.
Это Статический Блок Инициализации который запускается один раз при загрузке класса. Его можно использовать для инициализации статических переменных-членов.
Это статический инициализатор, который будет выполняться во время инициализации класса. Как вы можете видеть, он позволяет запускать сложную логику на этом этапе, включая обработку исключений.