Будет ли загружена первая статическая переменная или статический блок?

Один из моих друзей спросил меня, что будет загружать первую статическую переменную или статический блок.

Мой ответ указывает на статическую переменную.

Итак, он дал мне два уравнения и сказал, чтобы различать их
Первое уравнение

public class Some {
    public static void main(String args[])
    {
        System.out.println(Some.x);
    }
    static {
        System.out.println(Some.x);
    }
    static int x=90;
}

O/P: 0 90

Второе уравнение

public class Some {
    public static void main(String args[])
    {
        System.out.println(Some.x);
    }
    static int x=90;
    static {
        System.out.println(Some.x);
    }
}

O/P: 90 90

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

Ответ 2

статические переменные и статические блоки выполняются в том порядке, в котором они отображаются.

Здесь первый O/P: 0 90, как в инструкции System.out.println(Some.x); статического блока, выполненного после инструкции инициализации статической переменной static int x=90;

Ответ 3

static Переменные выполняются, когда JVM загружает класс, и класс загружается при вызове его экземпляра или его статического метода.

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

Ответ 4

Я даю простой пример для потока управления статическими и экземплярами:

Предположим, что у вас есть две кладки A и B. класс A продолжается до класса B. и класс B имеет основной метод. После успешной компиляции обеих команд на cmd выглядит так:

java B

Теперь, что будет выглядеть шаг за шагом:

  • будут загружены классы A и B
  • статические элементы и блоки класса A будут идентифицированы и будут выполняются последовательно (один за другим) (но только один раз во время загрузки класса)
  • статические элементы и блоки класса B будут идентифицироваться и выполняться (один за другим) (но только один раз во время загрузки класса).
  • будет вызываться основной метод класса B (в случае, если класс B не имеет основного метода, тогда будет вызван основной метод класса A)
  • Как только вы создадите объект класса A: все экземпляры инициализация элементов и исполнение блока экземпляра будут выполняться в класс A
  • конструктор класса A (который вы использовали для создания объекта) выполняться
  • Если вы создаете объект класса B: все экземпляры   инициализация элементов и исполнение блока экземпляра будут выполняться в   класс А.
  • конструктор класса A (конструктор по умолчанию или любой другой, если вы его вызвали из конструктора B), будет       выполняться

  • то все экземпляры       инициализация элементов и исполнение блока экземпляра будут выполняться в       класс B

  • и после этого конструктор класса B (который вы использовали для создающий объект) будет выполнен

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