Минимальное число статиков

  • 5
  • Недоступна
Расставьте минимальное количество static-ов, чтобы код начал работать, и программа успешно завершилась.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (183)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Neonila Kravtcova
Уровень 18, Санкт-Петербург, Россия
11 ноября 2021, 15:35
С первого раза, да без Идеи ) Но тема всё-равно странная эти статики..
DmitryReg
Уровень 9, Россия
10 октября 2021, 11:48
см. видео, грызу учебники а мозг в нетерпении очередного озарения: ХЛОП.. пришло! Можно жить.)
SWK
Уровень 13
7 октября 2021, 09:21
Думаю, большинство обучающихся эта задача ставит в тупик. И не факт, выбираясь из него, они много полезного узнают. Стоят ли те знания потраченного времени и отрицательных эмоций?
Modestpda
Уровень 8, воронеж, Россия
31 августа 2021, 15:36
new Solution().method3(); Поясните мне пожалуйста!!!!! Создаем экземпляр класса new Solution().. Но что это .method3();
chiffka Backend Developer в Freelance
3 мая 2021, 19:25
Объяснение задачи. Немного теории: когда мы запускаем программу, все методы, которые мы дёрнули, попадают в стек вызовов. Зачем он существует, нам не очень важно. Например, у нас есть такой код:
main() { method1(); }
method1() { method2(); }
method2() { }
Mетоды в стеке будут лежать так:
method2 -> вызванный последним
method1
main —> вызванный первым
К задаче: сначала как обычно запускаем static метод main. main вызывает не статический method1. Т.к. мы не можем из статического метода вызвать не статический, добавляем static к method1. Аналогично с method2. Теперь всё компилируется, но если запустить, мы получим какой-то бесконечный вывод. Вспомним про стек вызовов — печатается он. Но почему бесконечно? Смотрим на method2 и видим, что там создаётся экземпляр нашего класса: new Solution(). Т.е. всё, что не static, у него будет своё, в том числе step. У экземпляра сразу же вызван метод: new Solution().method3(). Он дёргает method4, в котором лежит логика:
public void method4() {
        step++; // это не статическая переменная, значит, инкремент идёт только в экземпляре класса, который был создан в method2
        for (StackTraceElement element : Thread.currentThread().getStackTrace()) // просто вывод стека вызовов
            System.out.println(element);
        if (step > 1) // когда step будет больше 1, завершим работу метода
            return;
        main(null); //зовём ещё раз main
    }
То есть на первом проходе step = 1, поэтому мы ещё раз вызываем main, ещё раз проходим этот весь путь. Когда мы оказываемся опять в method4, step = 0 (т.к. мы снова создавали новый экземпляр нашего класса). Значит, что пока step не статическая, код будет выполняться бесконечно. Вешаем static на step. Всё. =)
chiffka Backend Developer в Freelance
3 мая 2021, 19:26
Получается такой вывод (того самого стека вызовов из мини-теории в начале): тут всё, что было вызвано в первый проход
java.lang.Thread.getStackTrace(Thread.java:1559)
com.javarush.task.task06.task0616.Solution.method4(Solution.java:28)
com.javarush.task.task06.task0616.Solution.method3(Solution.java:23)
com.javarush.task.task06.task0616.Solution.method2(Solution.java:19)
com.javarush.task.task06.task0616.Solution.method1(Solution.java:15)
com.javarush.task.task06.task0616.Solution.main(Solution.java:11)
а тут всё, что было вызвано во второй раз (дважды, т.к. в стеке всё ещё лежат результаты первого вызова)
java.lang.Thread.getStackTrace(Thread.java:1559)
com.javarush.task.task06.task0616.Solution.method4(Solution.java:28)
com.javarush.task.task06.task0616.Solution.method3(Solution.java:23)
com.javarush.task.task06.task0616.Solution.method2(Solution.java:19)
com.javarush.task.task06.task0616.Solution.method1(Solution.java:15)
com.javarush.task.task06.task0616.Solution.main(Solution.java:11)
com.javarush.task.task06.task0616.Solution.method4(Solution.java:32)
com.javarush.task.task06.task0616.Solution.method3(Solution.java:23)
com.javarush.task.task06.task0616.Solution.method2(Solution.java:19)
com.javarush.task.task06.task0616.Solution.method1(Solution.java:15)
com.javarush.task.task06.task0616.Solution.main(Solution.java:11)
Александр Продан
Уровень 9, Одесса, Украина
4 декабря 2021, 19:58
Благодарю за такое развернутое обьяснение! К каждой задаче бы такие пояснения, было бы намного лучше усвоение материала.
Marat Minnigaliev
Уровень 17
30 апреля 2021, 02:45
решайте эту задачу в IDEA. вывод текста в таком виде немного смутил
Rodion
Уровень 20, Munich, Germany
27 января 2021, 21:04
Если ничего не понятно, то нажмите на популярные комментарии, так есть комментарий от Валерия 16.04.2017, он очень хорошо все объясняет.
Katerina Bykova у меня пока лапки в но я исправлюсь
21 января 2021, 10:45
Метод могучего научного тыка сработал с 4 попытки, но ясности в мозг не внес. Пошла читать....
Елена
Уровень 27, Санкт-Петербург
10 мая 2021, 08:45
также
Anonymous #2497433
Уровень 35
17 января 2021, 13:25
Java for each
Михаил
Уровень 19, Москва
24 декабря 2020, 15:00
По-моему, стоит исправить требование "модификаторы доступа методов менять нельзя" у задачи!!
Burnoutman
Уровень 8, Минск, Беларусь
4 января 2021, 21:19
Static — модификатор, применяемый к полю, блоку, методу или внутреннему классу. Данный модификатор указывает на привязку субъекта к текущему классу. А доступ, это public,private, protected.