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

  • 8
  • Недоступна
Снова и снова мы ищем чужие ошибки и исправляем их... Такова наша программистская доля. Наша программа снова выводит что-то не то: закралась ошибка (всего одна!). Найти и обезвредить! Для этого воспользуйтесь дебаггером IntelliJ IDEA.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (99)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Anton Bykov17 уровень, Омск
9 августа, 17:27
Подсказка это хорошо, но лучше убрать и оставить поиск решения за учеником. Задачу решил сам, прогоняя дебагер несколько раз и разбираясь что происходит, сам нашел ответ и сам же поставил правильный модификатор доступа, как итог : я понимаю, я могу делать сам, а не по подсказкам и это я считаю хорошо и правильно!
Руслан20 уровень, Усть-Орда
14 июля, 20:10
Хорошая задача, сокрытие метода делается) иначе переопределяется
Никола18 уровень, Москва
12 июля, 09:48
навертели, конечно, без умных товарищей не разберешься быстро) подсказку в условии лучше убрать и поставить задачке все звезды. иначе люди так и будут слепо ставить private, не понимая, что происходит в этом аду.
Василий22 уровень, Санкт-Петербург
10 июля, 21:28
Крутая задачка, однозначно!
Вэйлор19 уровень
2 июня, 13:40
Потратил часа 4 на задачу, не смотря на подсказку в условии. Задача на самом деле мегакрутая! Даже предположить не мог, что при создании экземпляра класса B с цифрой 6 в конструкторе эта самая цифра передастся в конструктор родительского класса и выведется на экран в случае выполнения требования условия задачи
Talgat16 уровень, Алматы
23 мая, 05:24
Копипаст коммента от Антон Никольский 1-jan-18: Ключевой вопрос этой задачи: метод initialize() в конструкторе класса А вызывается как "initialize() класса А" или "initialize() класса В"? Для ответа надо знать следующее: Порядок обработки кода: 1) Компилятор преобразует джава-код в байт-код (программа еще не выполняется) 2) Джава-машина выполняет байт-код (собственно выполнение программы) Порядок инициализации классов и новых объектов: 1) Статические элементы 2) Нестатические переменные родителя 3) Конструктор родителя 4) Нестатич-ие переменные наследника 5) Конструктор наследника В объекте класса В создается 2 переменных f1. а) Ситуация до исправления модификатора. При вызове new B(6) сначала происходит вызов конструктора класса А, а переменная f1 в коде класса В еще не инициализировалась и равна 0. В конструкторе класса А происходит вызов метода initialize(). Поскольку этот метод может быть переопределен в классах-наследниках, то компилятор не привязывает вызов этого метода к "initialize() класса А", а отдает этот вопрос на решение джава-машины. Джава-машина видит, что метод вызван из "объекта класса В" (потому как new B(6)), и соответственно вызывает "initialize() класса В". Однако переменная f1 в коде класса В еще не успела инициализоваться (см. порядок инициализации), поэтому выводится 0. б) Ситуация после исправления модификатора. Все то же самое, но теперь компилятор считает, что приватный метод "initialize() класса А" переопределяться не будет. Поэтому он жестко привязывает вызов метода initialize() в конструкторе А к "initialize() класса А" еще ДО выполнения программы. И джава-машине ничего не остается как вызывать там метод initialize() именно класса А, а не класса В. В интернете где-то есть по этому поводу информация, что в джаве (в отличие от С++) для приватных и финальных методов применяется раннее связывание (на уровне компилятора до выполнения программы), а для "обычных" методов - позднее связывание (на уровне джава-машины во время выполнения).
Dmitry Potamoshnev30 уровень, Москва
15 июня, 16:57
Спасибо!
jeka20 уровень
23 июня, 12:00
Спасибо огромнейшее! Я внимательно прочитал условия, исправил модификатор и проверка валидатора сразу прошла. Но сидел долго и мучался, т.к. совсем не понял в чем тут дело.
АртемGeek25 уровень, Москва
9 мая, 17:55
Надеюсь про типы связывания нам расскажут дальше по лекциям.
Serg22 уровень, Днепр
8 мая, 22:24
Прочитал условие и решил начать с самого легкого, сделал модификатор как просили и проверил результат, он получился как и требовали....может убрать эту подсказку?)
Павел20 уровень, Санкт-Петербург
8 мая, 09:27
а подскажите пожалуйста, почему если в классе А оставить protected, то сразу перепрыгиваем в метод который реализован в классе B? а если заприватить тгда выполняется метод в классе А????
Павел20 уровень, Санкт-Петербург
8 мая, 09:29
если я правилно понимаю, если не затнкапсулировать метод в классе А, то класс Б его наследует и переопределяет его под свой?
25 апреля, 04:00
задача отличная. а вот последовательность подачи материала вызывает вопросы.... ну мы конечно все полезли в интернет и давай там искать собственно по чему при изменении модификатора меняется вызов методов.. в итоге лично я пришел к тому что надо понимать что такое раннее и позднее связывание в 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 ) то будет вызываться метод суперкласса (родителя) и задача тоже будет решена.