Подтвердить что ты не робот

Классы Java и статические блоки

class Hello12 {
    static int b = 10;
    static {
        b = 100;
    }
}

class sample {
    public static void main(String args[]) {
        System.out.println(Hello12.b);
    }
}

При запуске выше кода вывод приходит как 100, потому что, когда я вызывал класс Hello, статический блок выполняется сначала, устанавливая значение b до 100 и отображая его. Но когда я пишу этот код:

class Hello12 {
    static {
         b = 100;
    }
    static int b = 10;
}

class sample {
    public static void main(String args[]) {
        System.out.println(Hello12.b);
    }
}

Здесь вывод будет равен 10. Я ожидаю ответа как 100, потому что, как только статический блок выполняется, он дал значение b как 100. Поэтому, когда в main() я вызывал Hello.b он должен был ссылаться на b (= 100). Какова память, выделенная для b в обоих кодах?

4b9b3361

Ответ 1

В "Подробной процедуре инициализации" для классов Раздел 12.4.2 JLS говорится:

Затем выполните либо инициализаторы переменной класса, либо статические инициализаторы класса, либо инициализаторы полей интерфейса, в текстовом порядке, как если бы они были одним блоком.

Это означает, что это как первый пример:

b = 10;
b = 100;

И второй пример:

b = 100;
b = 10;

Последнее присвоение "выигрывает", объясняя ваш результат.

Ответ 2

Статические блоки и статические переменные инициализируются в том порядке, в котором они появляются в источнике. Если ваш код:

class Hello12 {

  static int b = 10;
  static {
     b = 100;
  }

}

Результат равен 100.

Ответ 3

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

В то время как раздел 12.4.2 JLS объясняет, что статические блоки и статическая переменная выполняются в текстовом порядке, который они появляются, в разделе 8.3.3 JLS объясняется, когда вы можете ссылаться на что, и вы можете видеть, что условие The use is not on the left hand side of an assignment; завершается с ошибкой, позволяя вашему статическому блоку во втором примере ссылаться на статическую переменную, которая имеет не текстовым образом, чтобы быть объявленным/выполненным еще.

Ответ 4

Статика оценивается в том порядке, в котором они отображаются в программе.