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 в обоих кодах?
4 ответа
В "Подробной процедуре инициализации" для классов, раздел 12.4.2 JLS гласит:
Затем выполните инициализаторы переменных класса и статические инициализаторы класса или инициализаторы полей интерфейса в текстовом порядке, как если бы они были единым блоком.
Это означает, что первый пример был таким:
b = 10;
b = 100;
И второй пример был:
b = 100;
b = 10;
Последнее задание "выигрывает", объясняя ваш вывод.
Статические блоки и статические переменные инициализируются в порядке их появления в источнике. Если ваш код:
class Hello12 {
static int b = 10;
static {
b = 100;
}
}
Результат 100.
Помимо ответа на вопрос о том, как код выполняется в каком порядке, я предполагаю, что вы также хотите знать, почему статический блок может ссылаться на статическую переменную, которая еще не была объявлена / выполнена в текстовом формате.
В то время как раздел 12.4.2 JLS объясняет, что статические блоки и статические переменные выполняются в текстовом порядке, в котором они появляются, раздел 8.3.3 JLS объясняет, когда вы можете ссылаться на что, и вы можете видеть, что условие The use is not on the left hand side of an assignment;
терпит неудачу, позволяя вашему статическому блоку во втором примере ссылаться на статическую переменную, которая еще не была объявлена / выполнена в текстовом порядке.