Дебаг, дебаг, и еще раз дебаг

  • 8
  • Недоступна
Снова и снова мы ищем чужие ошибки и исправляем их... Такова наша программистская доля. Наша программа снова выводит что-то не то: закралась ошибка (всего одна!). Найти и обезвредить! Для этого воспользуйтесь дебаггером IntelliJ IDEA.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (86)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
16 часов назад
задача отличная. а вот последовательность подачи материала вызывает вопросы.... ну мы конечно все полезли в интернет и давай там искать собственно по чему при изменении модификатора меняется вызов методов.. в итоге лично я пришел к тому что надо понимать что такое раннее и позднее связывание в Java. https://javarush.ru/groups/posts/439-razlichija-mezhdu-rannim-i-pozdnim-svjazihvaniem-v-java ну и ссылка которая была уже конкретно объясняет что и почем http://pr0java.blogspot.com/2015/07/final.html другими словами если мы поле f1 сделаем static и методы initialize () тоже объявим как static - раннее связывание (статичное - т.е. во время компиляции, не создания экземпляра класса B ) то будет вызываться метод суперкласса (родителя) и задача тоже будет решена.
OlegZ16 уровень
пятница, 06:37
Да, сначала, задача взбесила. Но потом осознал, что она хорошо стимулирует поглубже разобраться в теме вызовов переопределенных статических и нестатических методов, а также с обращениями к затененным (скрытым) полям. В комментах уже была ссылка, повторюсь http://pr0java.blogspot.com/2015/07/blog-post_6.html
Семён20 уровень, Екатеринбург
8 апреля, 19:38
Кто-нибудь объясните почему, если в классе A метод initialize() имеет модификатор protected, то вызывается такой же метод, но из класса-потомка.
OlegZ16 уровень
пятница, 10:24
http://pr0java.blogspot.com/2015/07/final.html
Illia Kuznetsov17 уровень
19 марта, 19:09
Подсказка в условии ))) нужно поменять 1 модификатор доступа )
Pavel25 уровень, Москва
17 марта, 18:57
Про модификатор понятно. Не понятно почему метод initialize выдает 0, если в классе В поле public int f1 = 3; Т.е переменная инициализируется только после слова this.f1
Николай22 уровень
5 февраля, 09:04
Шикарная задача на понимание применимости модификаторов
S20 уровень, Минск
13 марта, 15:03
Дебильная задача. Намутили такого г, что непонятно что это и зачем. За такой код на работе ударят по голове клавиатурой.
Николай22 уровень
13 марта, 15:12
Затем, что бы понять некоторые моменты про использование модификаторов. Если сложно сразу понять, значит нужно немного притормозить с задачами и почитать литературу по этой теме - и когда станет понятнее, то переходить дальше.
Павел Гордиевич20 уровень, Минск
5 февраля, 08:05
Очень хорошая статья для понимания переопределения методов http://pr0java.blogspot.com/2015/07/blog-post_6.html
S3R3N1TY33 уровень, Санкт-Петербург
21 января, 20:23
Интересная задача, решил сам через дебагер, когда увидел что во время работы конструктора класса A вызывается intialize класса B. Не читайте требования к задаче, уже после увидел что там есть ответ !
Yaroslav Tolstik23 уровень, Минск
1 февраля, 18:19
ты сам нормально так подсказал))))
NewBuy19 уровень, Санкт-Петербург
17 марта, 09:33
сначала подумал, что правильным решением будет добавить аругмент методу Initialize класса А, но потом прочитал требования. Но все-равно не понял, почему это работает
S3R3N1TY33 уровень, Санкт-Петербург
17 марта, 16:59
Через дабер видно, как принимают значения переменные, в какой последовательности. У нас изначально метод
protected void initialize() {
         System.out.println(f1); }
имеет мод.доступа protected и переопределяется в классе потомке. Поэтому в начале программа выводит цифру ноль, так как до инициализации мы не дошли. Тип int по умолчанию имеет значение "0", а мы еще не дошли до инициализации. А вот если поставим private у метода, то он не будет переопределяться в классе потомке и выведется значение в начале 6, потом 9. Словами трудно обьяснить, лучше самому по шагам выполнить и тогда все будет понятно.
NewBuy19 уровень, Санкт-Петербург
18 марта, 16:44
Спасибо, уже порылся в комментариях, и ниже Антон Никольский очень толково объяснил про то, что компилятор привязывает вызов приватного метода к классу, или же оставляет решение на JVM, если метод может быть переопределен.
Владислав19 уровень
пятница, 00:00
переопределяется в классе потомке Этими словами ты для меня объяснил всё,спасибо) просто непривычно когда нету выше надписи override)
Anton Lukyanov23 уровень, Гомель
3 ноября 2018, 20:19
и почему в лекциях не было пояснений подобных ошибок? прошелся дебагером, понял что вызывается метод дочернего класса, а не тот, что задумывался, но совершенно не понял как исправить это, а все потому, что нигде не было информации про особую связь private методов и переопределенных методов с расширенным модификатором доступа. Если я не прав, и где-то в лекциях это объясняли, то плиз дайте ссылку
Игорь17 уровень
3 февраля, 19:15
Я тоже сразу не понял. Потом перечитал лекцию про модификаторы доступа, которая была на этом уровне https://javarush.ru/quests/lectures/questcore.level05.lecture01 Там оказывается для модификатора private четко указано "Это самая высокая степень закрытости – только свой класс. Такие методы не наследуются и не переопределяются. Доступ к ним из класса-наследника также невозможен." Например, если указать private для initialize() в классе A, а потом попытаться написать @Override перед методом initialize() в классе B, то мы увидим, что компилятор выдает ошибку. То есть система не видит, чтобы у класса A был аналогичный метод и без @Override выполняется не переопределение, а создание нового метода.
Anton22 уровень, Москва
3 октября 2018, 17:56
В замечательном объяснении Антона Никольского (ниже) кроется второй вариант решения задачи (хоть и более кривой, чем замена модификатора доступа): увидев после пробежки дебагером что вызывается метод класса B - я просто расставил статики, а в конструкторе класса А инициировал явный вызов метода initialize именно класа А (А.initialize()). Вывод на экран получился 6 и 9, но валидатор вряд ли принял бы, ибо не соответствовало требованиям). Как и писали ниже - хорошо сначала попытаться решить, потом прочитать требования, а потом уже скормить валидатору... Интересные решения могут открыться=)