Статические инициализаторы против инициаторов инициализаторов и конструкторов

Я изучаю экзамен по Java. Пока я учился, я встречал синтаксисы в java, которые мне незнакомы. Такие, как фигурные скобки ({}) без тела класса без имени, у некоторых есть статическое ключевое слово. Я узнал, что они называются "Инициализаторы". Может ли кто-нибудь помочь мне указать на основные различия между ними и то, как они отличаются от конструктора. Благодаря

Ответ 1

Основное различие между ними - порядок, в котором они выполняются. Чтобы проиллюстрировать это, я объясню их на примере:

public class SomeTest {

    static int staticVariable;
    int instanceVariable;        

    // Static initialization block:
    static {
        System.out.println("Static initialization.");
        staticVariable = 5;
    }

    // Instance initialization block:
    {
        System.out.println("Instance initialization.");
        instanceVariable = 10;
    }

    // Constructor
    public SomeTest() {
        System.out.println("Constructor executed.");
    }

    public static void main(String[] args) {
        new SomeTest();
        new SomeTest();
    }
}

Выход будет:

Static initalization.
Instance initialization.
Constructor executed.
Instance initialization.
Constructor executed.

Кратко говорим:

  • Статические блоки инициализации запускаются после того, как класс загружается JVM.
  • Блоки инициализации экземпляра запускаются перед конструктором каждый раз, когда вы создаете экземпляр объекта.
  • Конструктор (очевидно) запускается каждый раз при создании объекта.

Ответ 2

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

Статические инициализаторы полезны для выполнения кода установки в статических классах и заполнения структур данных в Enums. Они вызываются один раз, по порядку сверху вниз, когда класс загружается в JVM, и данные существуют в пределах класса Class или Enum. Все ссылки на класс возвращают одинаковое значение для полей, инициализированных в статических инициализаторах

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

Ответ 3

Это то, что вам действительно нужно посмотреть в учебнике, чтобы получить ответ. Однако я могу дать вам несколько указателей. Прошло несколько лет с тех пор, как я запрограммировал Java, поэтому любая информация, которую я вам дал, является общей.

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