Именно эта задачка меня всего затруднила. Я не могу понять в какой последовательности идёт исполнение кода, и как не interface может создавать действие swim
Алексей
16 уровень
Нужно обьяснение
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Александр Колинченко Java Developer в EPAM
27 декабря 2017, 13:20решение
Ну и почему не interface может "создавать действие swim"
Потому что заготовку для классов-наследников с "наметками" методов, объекты которой нельзя создать напрямую, а можно только сделать класс-наследник, можно сделать не только с помощью интерфейсов, но и при помощи abstract классов. Более того, интерфейсы - это по сути абстрактные классы с еще более строгими ограничениями, не буду здесь расписывать.
+2
Александр Колинченко Java Developer в EPAM
27 декабря 2017, 13:13полезный
Сами слова abstract и interface у классов означают, что нельзя создать объекты этих классов.
Слово abstract у метода означает, что у метода нет тела (реализации) и что класс обязательно тоже должен быть abstract (нельзя создать объект, у которого метод объявлен, но тела метода нет).
Т.е. условия 4 и 5 означают, что в классах Horse и Pegas не должно быть слов abstract ни в описании классов ни в описании методов (так как из них по условию можно сделать объект).
Из условия 6 следует, что как метод fly у класса SwimPegas ( у него не должно быть тела), так и класс SwimPegas (поскольку у него один метод без тела) должны быть abstract.
Сам код в Main работает так.
Здесь мы создаем новый объект типа Pegas (new Pegas()), а потом "втискиваем" его в переменную типа Horse. Это возможно, так как Pegas - наследник класса Horse. Произойдет следующее. Внутри переменной вроде как сидит Pegas, но делать он сможет только то, что умеет делать лошадь (т.е. только выполнять метод run()), но не сможет летать (выполнять пегасовский метод fly()).
Если бы мы написали Pegas horse = new Pegas(), тогда можно было бы написать как
horse.run(); так и horse.fly();
+24
Алексей
27 декабря 2017, 13:42
Спасибо большое, что разъяснил. Теперь я более менее понял эту тему.
0
Andrei Pilipuk
29 июня 2018, 15:39
"Сами слова abstract и interface у классов означают, что нельзя создать объекты этих классов. "
Почему тогда IDEA пропускает создание объекта абстрактного класса:
Horse horse = new SwimPegas() {
@Override
public void swim() {
}
};
Я тут явно что то не догоняю!
+1
Александр Колинченко Java Developer в EPAM
3 июля 2018, 19:31
Это не создание объекта абстрактного класса. Здесь происходит создание объекта так называемого "анонимного класса" на базе абстрактного класса SwimPegas. Анонимный класс - это когда ты прямо на лету в коде, без выделения отдельного файла для нового класса делаешь объект из абстрактного класса, при этом прямо тут же в коде, в фигурных скобках, пишешь имплементации всех абстрактных методов этого абстрактного класса. Джава в фоне сама делает отдельный класс кстати, его название можно посмотреть, если вывести в консоль название класса получившегося объекта.
Если посмотреть на твой пример, то в нем метод swim (который в классе SwimPegas был абстрактным) имплементирован, у него есть тело, хотя и ничего не делающее.
Анонимные классы часто применяются, удобная штука. По-ним, дальше будет урок, если не ошибаюсь.
+2