Java

какая разница между интерфейсом и абстрактным классом? И есть она принципиальная ?. Приведите примеры.

Некст квештіон:
Animals cat = new Cat() ;//есть интерфейс Animals от него наследуется класс Cat
cat.bothYear;
//какая разница между верхним и нижним ?
Сat cat = new Cat();
cat.bothYear;
//метод bothYear є в интерфейс Animals, но реализован в Cat
Начну со второго вопроса.
Я бы назвал интерфейс Animal (животное). Потому что кошка — это животное, а не животные.

В обоих случаях мы вызываем метод, объявленный в интерфейсе Animal и реализованный в классе Cat. Разницы нет, так как в обоих случаях мы создаем объект Cat и вызываем его метод. Просто на этот объект в разных случаях ссылаются переменные разных типов.

Но у Cat могут быть свои методы, которых нет у Animal. А также реализованные в Cat методы из других интерфейсов, о которых в Animal ничего не сказано.

И тут мы плавно переходим к ответу на первый вопрос. Абстрактный класс похож на интерфейс тем, что может иметь абстрактные методы: заголовок, параметры, возвращаемое значение — и больше ничего. Потомки должны реализовать абстрактные методы, иначе они сами обречены быть абстрактными классами.

Помимо этого, у абстрактного класса есть масса достоинств: у него могут быть реальные поля и нормальные, реализованные методы, общие для всех потомков. Например, если кот и пес бегают одинаково, то метод бега можно прописать у их абстрактного предка. В интерфейсе так нельзя: там все методы абстрактны по определению. Интерфейс сообщает, что можно делать с объектом, но ничего не говорит о том, как это делается.

С другой стороны, у абстрактного класса (в Java) есть один недостаток: если от него наследуется класс, то второго предка быть уже не может. Предок всегда один. А интерфейс — это не предок, а безвольный трафарет. Один объект может реализовать немерено интерфейсов.

А зачем это всё нужно?

Дело в том, что разные программисты пишут программные модули и библиотеки друг для друга, а иногда и для себя, для своего удобства и для красоты программной структуры: легче разобраться в своей стряпне спустя полгода, когда всё забыл. При этом программист старается сделать свою часть предельно независимой от остальных частей, но предоставить удобные способы обращения со своим модулем.

(Код с плохо изолированными модулями называется «спагетти-кодом»: ты берешь один модуль, а за ним тянутся остальные, как лапша.)

Например, если человек пишет модуль, реализующий парикмахерскую для животных, то для стрижки он не возьмет Cat или Dog. Он сделает модуль универсальным и реализует поддержку любых Animal. Можешь ему накидать собак, рыбок, обезьян, тараканов или недавно разведенных марсианских креветок — всех попробует постричь. Потому что ему плевать, какого зверя ты ему даешь. Он видит только методы Animal и работает с ними.

Это абстракция — важнейшая парадигма ООП.
ГМ
Гарифулла М
68 506
Лучший ответ
Самат Калмурзин то есть если бы я выбирал между интерфейсом Cat и абстрактным классом CAt, что лучше выбрать?
класс может РАСШИРЯТЬ только один класс -- абстрактный или нет, не важно
класс может РЕАЛИЗОВЫВАТЬ "сколько угодно" интерфейсов...
пиво должно быть доведено до правильной температуры перед употреблением.
VB
Vitaliy Babushkin
72 451
Абстрактный класс может иметь некую реализацию и класс который его наследует обязан реализовать абстрактные методы.
Интерфейс не может иметь реализации, а класс который его реализует (не наследует)
обязан реализовать все что есть в интерфейсе...

Учи матчасть.
Vitaliy Babushkin теперь уже можно и реализацию делать прямо в интерфейсе...
Vitaliy Babushkin абстрактный класс не реализуется... он наследуется... с реализацией абстрактных классов родителя (если есть на то нужда)