5

Зачем в java интерфейс, если есть абстрактные классы? Кроме множественного наследования, в чем главные различия?

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
voipp
  • 2,444
  • 1
    @GenCloud задавать "глупые" вопросы не плохо, а плохо - не понимать. Вы уверены , что знаете ответ на этот вопрос ? – voipp Sep 24 '16 at 09:06
  • Никто не вспомнил, что абстрактный класс позволяет хранить состояние объекта (в полях), а вот интерфейс - нет. – TheSN Sep 25 '16 at 07:35

4 Answers4

18

Разница в концепции.

Абстрактные классы помогают создавать иерархию с общими чертами. Важным тут является именно связь родитель — наследник. Например абстрактный класс «птица», ее наследники — конкретные виды птиц.

При использовании нам не важно, какая именно птица будет — мы используем ссылку с типом абстрактного класса. И используем методы «кричать», «ходить», «летать». Все ок, но что если не все птицы умеют летать? Например страус, пингвин.

Здесь нам могут помочь интерфейсы, которым не важна связь родитель — наследник, они задают правила поведения. Мы можем выделить метод «летать» в интерфейс и реализовать его у тех птиц, которые могут летать; при этом каждая птица может летать характерным только для нее способом. Так же мы сможем в будущем реализовать этот интерфейс у самолета и определить его способ полета.

Например, у нас на острове группа зверей, птиц, машин и нам надо переправить их на другой остров. В этом случае это сделают те, кто реализует интерфейс с методом «летать».

И здесь мы получаем две ветви полиморфизма, одна задает связь родитель —наследник, вторая — поведение.

Arhadthedev
  • 11,528
a.chugunov
  • 1,126
4

Допустим, есть три экземпляра классов лошадь, машина, лодка. Все они могут реализовывать интерфейс "перевозка людей". И не важно, каким способом каждый из объектов это делает. Главное, что обязан делать. Когда надо "перевезти людей", по интерфейсу мы можем обратиться к тем объектам, которые его могут реализовать. Кроме того, интерфейсная ссылка, указывая на экземпляр класса, сохраняет его от сборки мусора, когда ссылок на него не осталось.

2

Реализации модульности, слабой связанность. Отличие от абстрактного класса - в JVM нет множественного наследования и конкретный класс может наследовать только от одного абстрактного. А вот implement интерфейсов - может, сколько угодно.

GenCloud
  • 1,086
  • я написал это в своем вопросе. невнимательно прочитали – voipp Sep 24 '16 at 09:02
  • Ну, вообще не сколько угодно) 67 000 интерфейсов вы не сможете реализовать в одном классе - JVM не позволит. А вот 65 000 - пожалуйста) – ЮрийСПб Sep 24 '16 at 09:15
  • @ЮрийСПб всё... пора закрывать Java. Ну это же фуу, не способность реализовать 67000 интерфейсов. Дилетанто! – Алексей Шиманский Sep 24 '16 at 09:24
  • @АлексейШиманский, ага, а ещё она сообщения об ошибках неправильные пишет( Был недавно случай, когда с меня требовала она 8 версию, вместо того, чтобы объяснить, что надо код не в интерфейс а в класс пихать( – ЮрийСПб Sep 24 '16 at 09:27
0

Насколько я знаю, интерфейсы в java могут содержать только абстрактные методы и никакой реализации. В них нет конструкторов. В абстрактном классе может быть 1 или больше абстрактных методов, и также он может иметь методы с реализацией. В АК есть конструктор.

Класс может наследовать много интерфейсов, но только один класс.

Пишу на Scala, там используются трейты вместо интерфейсов. Вышесказанное относится и к трейтам тоже, но там еще можно прокинуть type class в него, и плюс в нем могут быть абстрактные и реализованные методы.

Bogdan
  • 2,472
  • 3
    @AlexanderKondaurov выбор языка на парадигмы не влияет – etki Sep 24 '16 at 08:04
  • @Etki, не понял вас – Alexander Kondaurov Sep 24 '16 at 08:08
  • @AlexanderKondaurov да не в имплементации проблема, проблема в том, что вы концепцию не понимаете. Формальные различия в применении здесь может любой описать. – etki Sep 24 '16 at 08:33
  • @etki, просветите меня пожалуйста, какую я там концепцию не понимаю? – Alexander Kondaurov Sep 24 '16 at 08:35
  • @AlexanderKondaurov я про контракты – etki Sep 24 '16 at 08:39