Обнаружил для себя "неожиданный" нюансик в поведении переменных. Пример кода:
public class Test {
static String id;
static {id ="aaa";}
{id = "bbb";}
public static void main(String[] args) {System. out .println(id);}
}
На консоль: ааа
Вопрос: как изменить единственную строку в main, чтобы вывелось bbb ?
Евгений Буш
35 уровень
Нюанс с переменными
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
9 декабря 2019, 21:34
Хороший вопрос, это проходили во втором квесте, но в потоке информации могло забыться.
0
Евгений Буш Программист в Компания Expert
10 декабря 2019, 06:25
не, не забылось. порядок вызова помнится. но только щас до печенок дошло, что статики загружаются только один раз вместе с классом, а нон-статики каждый раз с рождением объекта.
0
VladimirMaster
9 декабря 2019, 13:18
В данном случае статический блок выполняется последний в списке. В данном случае будет выполнен статический блок ссс. Если удалишь блок ссс, то выполнится блок bbb.
0
Евгений Буш Программист в Компания Expert
9 декабря 2019, 13:29
"bbb" в non-static блоке! и блока с "ссс" нет в примере.Изменить нужно только строку System. out .println(id); в main()
0
VladimirMaster
9 декабря 2019, 13:39
Я тебе намекаю, но ты не понял. Ладно. Смотри. Статический блок выполняется до вызова конструктора. Так? Так! Значит в главном методе main переменная id инициализируется до вызова конструктора. И на консоли ты видишь именно ааа. Что-бы увидеть инициализацию нестатического блока, ты должен вызвать конструктор. Примерно так:
Теперь ты на консоли увидишь bbb +2
Евгений Буш Программист в Компания Expert
9 декабря 2019, 13:48
ну да, я ждал ответа System.out.print(new Test().id); Думал, парни голову поломают, а тут гуру 😇впряглись
+1
VladimirMaster
9 декабря 2019, 13:53
Та брось ты, Гуру. :) Это же прописные истины. Их необходимо знать всем Java Dev. :)
0