Некст квештіон:
Animals cat = new Cat() ;//есть интерфейс Animals от него наследуется класс Cat
cat.bothYear;
//какая разница между верхним и нижним ?
Сat cat = new Cat();
cat.bothYear;
//метод bothYear є в интерфейс Animals, но реализован в Cat
Java
какая разница между интерфейсом и абстрактным классом? И есть она принципиальная ?. Приведите примеры.
Начну со второго вопроса.
Я бы назвал интерфейс Animal (животное). Потому что кошка — это животное, а не животные.
В обоих случаях мы вызываем метод, объявленный в интерфейсе Animal и реализованный в классе Cat. Разницы нет, так как в обоих случаях мы создаем объект Cat и вызываем его метод. Просто на этот объект в разных случаях ссылаются переменные разных типов.
Но у Cat могут быть свои методы, которых нет у Animal. А также реализованные в Cat методы из других интерфейсов, о которых в Animal ничего не сказано.
И тут мы плавно переходим к ответу на первый вопрос. Абстрактный класс похож на интерфейс тем, что может иметь абстрактные методы: заголовок, параметры, возвращаемое значение — и больше ничего. Потомки должны реализовать абстрактные методы, иначе они сами обречены быть абстрактными классами.
Помимо этого, у абстрактного класса есть масса достоинств: у него могут быть реальные поля и нормальные, реализованные методы, общие для всех потомков. Например, если кот и пес бегают одинаково, то метод бега можно прописать у их абстрактного предка. В интерфейсе так нельзя: там все методы абстрактны по определению. Интерфейс сообщает, что можно делать с объектом, но ничего не говорит о том, как это делается.
С другой стороны, у абстрактного класса (в Java) есть один недостаток: если от него наследуется класс, то второго предка быть уже не может. Предок всегда один. А интерфейс — это не предок, а безвольный трафарет. Один объект может реализовать немерено интерфейсов.
А зачем это всё нужно?
Дело в том, что разные программисты пишут программные модули и библиотеки друг для друга, а иногда и для себя, для своего удобства и для красоты программной структуры: легче разобраться в своей стряпне спустя полгода, когда всё забыл. При этом программист старается сделать свою часть предельно независимой от остальных частей, но предоставить удобные способы обращения со своим модулем.
(Код с плохо изолированными модулями называется «спагетти-кодом»: ты берешь один модуль, а за ним тянутся остальные, как лапша.)
Например, если человек пишет модуль, реализующий парикмахерскую для животных, то для стрижки он не возьмет Cat или Dog. Он сделает модуль универсальным и реализует поддержку любых Animal. Можешь ему накидать собак, рыбок, обезьян, тараканов или недавно разведенных марсианских креветок — всех попробует постричь. Потому что ему плевать, какого зверя ты ему даешь. Он видит только методы Animal и работает с ними.
Это абстракция — важнейшая парадигма ООП.
Я бы назвал интерфейс Animal (животное). Потому что кошка — это животное, а не животные.
В обоих случаях мы вызываем метод, объявленный в интерфейсе Animal и реализованный в классе Cat. Разницы нет, так как в обоих случаях мы создаем объект Cat и вызываем его метод. Просто на этот объект в разных случаях ссылаются переменные разных типов.
Но у Cat могут быть свои методы, которых нет у Animal. А также реализованные в Cat методы из других интерфейсов, о которых в Animal ничего не сказано.
И тут мы плавно переходим к ответу на первый вопрос. Абстрактный класс похож на интерфейс тем, что может иметь абстрактные методы: заголовок, параметры, возвращаемое значение — и больше ничего. Потомки должны реализовать абстрактные методы, иначе они сами обречены быть абстрактными классами.
Помимо этого, у абстрактного класса есть масса достоинств: у него могут быть реальные поля и нормальные, реализованные методы, общие для всех потомков. Например, если кот и пес бегают одинаково, то метод бега можно прописать у их абстрактного предка. В интерфейсе так нельзя: там все методы абстрактны по определению. Интерфейс сообщает, что можно делать с объектом, но ничего не говорит о том, как это делается.
С другой стороны, у абстрактного класса (в Java) есть один недостаток: если от него наследуется класс, то второго предка быть уже не может. Предок всегда один. А интерфейс — это не предок, а безвольный трафарет. Один объект может реализовать немерено интерфейсов.
А зачем это всё нужно?
Дело в том, что разные программисты пишут программные модули и библиотеки друг для друга, а иногда и для себя, для своего удобства и для красоты программной структуры: легче разобраться в своей стряпне спустя полгода, когда всё забыл. При этом программист старается сделать свою часть предельно независимой от остальных частей, но предоставить удобные способы обращения со своим модулем.
(Код с плохо изолированными модулями называется «спагетти-кодом»: ты берешь один модуль, а за ним тянутся остальные, как лапша.)
Например, если человек пишет модуль, реализующий парикмахерскую для животных, то для стрижки он не возьмет Cat или Dog. Он сделает модуль универсальным и реализует поддержку любых Animal. Можешь ему накидать собак, рыбок, обезьян, тараканов или недавно разведенных марсианских креветок — всех попробует постричь. Потому что ему плевать, какого зверя ты ему даешь. Он видит только методы Animal и работает с ними.
Это абстракция — важнейшая парадигма ООП.
Самат Калмурзин
то есть если бы я выбирал между интерфейсом Cat и абстрактным классом CAt, что лучше выбрать?
класс может РАСШИРЯТЬ только один класс -- абстрактный или нет, не важно
класс может РЕАЛИЗОВЫВАТЬ "сколько угодно" интерфейсов...
пиво должно быть доведено до правильной температуры перед употреблением.
класс может РЕАЛИЗОВЫВАТЬ "сколько угодно" интерфейсов...
пиво должно быть доведено до правильной температуры перед употреблением.
Абстрактный класс может иметь некую реализацию и класс который его наследует обязан реализовать абстрактные методы.
Интерфейс не может иметь реализации, а класс который его реализует (не наследует)
обязан реализовать все что есть в интерфейсе...
Учи матчасть.
Интерфейс не может иметь реализации, а класс который его реализует (не наследует)
обязан реализовать все что есть в интерфейсе...
Учи матчасть.
Vitaliy Babushkin
теперь уже можно и реализацию делать прямо в интерфейсе...
Vitaliy Babushkin
абстрактный класс не реализуется... он наследуется... с реализацией абстрактных классов родителя (если есть на то нужда)
Похожие вопросы
- Подскажите зачем в Яве интерфейсы и абстрактные классы
- Чем абстрактный класс отличается от интерфейса?
- Абстрактный класс или интерфейс (java)
- как правильней организовывать абстрактный класс JAVA
- Зачем в Java придумали абстрактные классы?
- Как создать программу (Java), чтобы была не консольной, а с интерфейсом GUI
- Можно ли реализовать полиморфизм (Java) с общим конструктором для разных дочерних классов?
- Какая разница между объектом, экземпляром, ссылке? Прочитайте вопрос полностью...
- Стоит ли во всех случаях сделать методы класса статичным, если они не используют абсолютно никакое поле класса?
- KAFKA, в чем смысл ее использования на данном примере?