Почему от положения статического блока зависит результат? Ведь порядок инициализации не изменяется, т.е. сначала статические поля, потом статический блок. Поставь я его хоть в самый конец результат меняться не должен. Однако, он меняется.
+Если сначала инициализируются статические поля, то каким образом потом изменяется значение константы, если оно уже проинициализировано и == 0?
public class Solution {
static {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
A = Integer.parseInt(reader.readLine());
B = Integer.parseInt(reader.readLine());
} catch (IOException e) {
System.err.println(e);
}
}
public static int A;
public static int B;
public static final int MIN = min(A, B);
public static void main(String[] args) {
System.out.println(MIN);
}
public static int min(int a, int b) {
return a < b ? a : b;
}
}
CilitBang
25 уровень
Порядок инициализации
Решен
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
10 мая 2020, 20:55решение
Для таких вопросов есть два источника, гугль, который сразу даст ответ, и собственно JLS, спецификация языка.
А там сказано следующее, цитирую почти дословно:
"порядок выполнения статических переменных/блоков идет в текстовом порядке их указания".
То есть если сначала статический блок, а потом статическая переменная, то тогда будет исполнятся блок, а потом статическая переменная.
То есть, приоритет они имеют одинаковый и порядок выполнения определяется сверху вниз в порядке что встретится первее.
Тоже касается и переменных/блоков экземпляра класса (обычных).
textual order
Такое очень любят спрашивать во всяких джава-паззлерах и тестах
+3
CilitBang QA в КЕФИР!
11 мая 2020, 07:29
Спасибо. Гуглил, смотрел ютуб, читал литературу. Везде: 1. переменные, 2. блоки. Даже исходя из твоего текста я бы сделал точно такой же вывод ."порядок выполнения статических переменных/блоков идет в текстовом порядке их указания". Ну да, сначала по порядку переменные, потом по порядку блоки. Кстати, так объясняли на ютубе, что запутало еще сильнее.
Теперь, благодаря тебе, я знаю, что у них равноправие. Спасибо. Как всегда лучший.
+1
taketori
10 мая 2020, 20:51
Классный вопрос! Покрутил у себя код, попереставлял. Получилось, что если
идет раньше static блока, то он успевает вычислиться до инициализации A, B.
MIN при этом == 0;
Я предполагаю, что по сути такая конструкция представляет из себя неявный static блок:
Тогда они равноправны, и кого мы укажем раньше, тот и будет вперед вычислен.
А что скажут знатоки? +1