Основы Java: статическая функция без имени или возвращаемого типа - PullRequest
6 голосов
/ 12 апреля 2011
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 (которую я сейчас изучаю).

Что это?for?

Когда это обычно используется?

Когда это будет выполнено в программе?

Ответы [ 6 ]

6 голосов
/ 12 апреля 2011

Это называется статическим блоком и будет выполняться только один раз во время инициализации.Кроме того, если имеется более одного статического блока инициализации, время выполнения гарантирует, что они будут вызваны в порядке их появления в исходном коде.

Вот довольно хорошее объяснение с примером кода a.https://www.geeksforgeeks.org/g-fact-79/

3 голосов
/ 12 апреля 2011

Выполняется один раз при загрузке класса. В этом конкретном случае он устанавливает регистратор для приложения.

2 голосов
/ 11 мая 2016

Вы можете работать только со статическими переменными-членами с статическим блоком . И обратите внимание, что даже если вы вызываете конструктор несколько раз, статический блок будет запускаться только один раз на 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 раза, однако статический блок вызывается только один раз.

0 голосов
/ 12 апреля 2011

Это блок инициализации и вызывается во время загрузки класса.

0 голосов
/ 12 апреля 2011

Это статический инициализатор , который будет выполняться во время инициализации класса.Как видите, он позволяет вам запускать сложную логику на этом этапе, включая обработку исключений.

0 голосов
/ 12 апреля 2011

Это Статический блок инициализации , который запускается один раз при загрузке класса.Может использоваться для инициализации статических переменных-членов.

...