Классы 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 в обоих кодах?
Ответы
Ответ 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
Статика оценивается в том порядке, в котором они отображаются в программе.