Одна из самых интересных задач пока.
Для меня оказалась очень трудной. Понять, что нужно добавить в конструктор еще одного родителя и понаделать еще четыре объекта было не сложно.
Сложно было придумать как задать условия в @override. Не скрою сам так и не придумал. Подсмотрел в обсуждениях и воспользовался советом внести null параметр при создании объектов "папа" и "мама".
Но это все понятно, и доступно.
Но вот чего я не понял до сих пор так это как работает @override. Да. даже выстроив там все условные операторы и получив корректный вывод с первого раза для меня осталось тайной почему, п о ч е м у он вообще запускается. "Он" - это кусок кода после @override.
Комрадос, если кому не лень может объясните на пальцах...
AlexeyN
22 уровень
Как работает @override так и не понял.
Обсуждается
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #2322530
10 декабря 2020, 08:27
@Override сама по себе это аннотация. которая при компиляции проверяет, действительно ли ты переопределил метод или нет. не более того. в остальном Ксения всё объяснила.
0
Иван ЛинникJava Developer в Спільна справа
9 декабря 2020, 18:57
Мы должны дать Java понять, что мы не ошиблись и не назвали метод названием, которое уже есть, из-за невнимательности. Чтобы сказать, что мы знаем, что делаем и действительно хотим переопределить (по англ. "override") метод, нужно над методом написать @Override.
Источник
0
Ksenia VolkovaJava Developer в DXCMaster
9 декабря 2020, 18:56
@Override тут вообще ни при чем. Если убрать из кода "@Override", он будет работать точно так же.
Дело в том, что при вызове метода println() объект будет передан в метод String.valueOf(), а тот в совю очередь вызовет у него метод toString().
А toString() - это тот самый метод, который и формирует строки в твоем коде.
Все это ты можешь посмотреть, например, в Идее, если нажмешь Ctrl и ткнешь мышкой в "println()", и дальше - по цепочке вызовов методов.
+1
AlexeyN
9 декабря 2020, 19:08
О!
Становится немного понятней.
В описаниях @override, которые я прочитал пытаясь решить эту задачу, везде говорилось, что эта пометка переопределяет некий метод.
И в примерах везде было понятно. Приводился код метода, а потом его "перезаписывали".
Все было просто. А вот в коде "Родственные связи котов" я не видел никаких методов, которые бы запускались, соответственно не мог понять что перезаписывает кусок кода после @override.
Как только вы описали цепочку запусков методов начиная с prinln() немного прояснилось. Спасибо!
0
Ksenia VolkovaJava Developer в DXCMaster
9 декабря 2020, 19:17
В этой задаче в классе Cat переопределяется метод toString(). Это метод, который есть абсолютно у всех классов, потому что он есть в классе Object, а все классы в конечном счете наследуются от Object (в том числе и те, которые ты создаешь). Но если его не переопределить, то он будет выдвать просто имя класса и хэшкод объекта (так реализован этот метод в самом классе Object).
0
AlexeyN
10 декабря 2020, 06:14
А вот еще вопрос.
При выводе реализована проверка на parent == null. А можно как-то эту проверку реализовать не просто наличие отсутствия значения параметра parent, а и на то какое значение в него передается, или даже откуда.
0
Ksenia VolkovaJava Developer в DXCMaster
10 декабря 2020, 08:26полезный
Можно проверять только, какое значение там есть сейчас. Переменная ничего не знает о том, что и когда в нее передавали.
+1