#java #ооп
This question already has answers here: Отличия абстрактного класса от интерфейса (abstract class and interface) (12 ответов) Closed 3 года назад. Зачем в java интерфейс, если есть абстрактные классы? Кроме множественного наследования, в чем главные различия?
Ответы
Ответ 1
Разница в концепции. Абстрактные классы помогают создавать иерархию с общими чертами. Важным тут является именно связь родитель — наследник. Например абстрактный класс «птица», ее наследники — конкретные виды птиц. При использовании нам не важно, какая именно птица будет — мы используем ссылку с типом абстрактного класса. И используем методы «кричать», «ходить», «летать». Все ок, но что если не все птицы умеют летать? Например страус, пингвин. Здесь нам могут помочь интерфейсы, которым не важна связь родитель — наследник, они задают правила поведения. Мы можем выделить метод «летать» в интерфейс и реализовать его у тех птиц, которые могут летать; при этом каждая птица может летать характерным только для нее способом. Так же мы сможем в будущем реализовать этот интерфейс у самолета и определить его способ полета. Например, у нас на острове группа зверей, птиц, машин и нам надо переправить их на другой остров. В этом случае это сделают те, кто реализует интерфейс с методом «летать». И здесь мы получаем две ветви полиморфизма, одна задает связь родитель —наследник, вторая — поведение.Ответ 2
Допустим, есть три экземпляра классов лошадь, машина, лодка. Все они могут реализовывать интерфейс "перевозка людей". И не важно, каким способом каждый из объектов это делает. Главное, что обязан делать. Когда надо "перевезти людей", по интерфейсу мы можем обратиться к тем объектам, которые его могут реализовать. Кроме того, интерфейсная ссылка, указывая на экземпляр класса, сохраняет его от сборки мусора, когда ссылок на него не осталось.Ответ 3
Реализации модульности, слабой связанность. Отличие от абстрактного класса - в JVM нет множественного наследования и конкретный класс может наследовать только от одного абстрактного. А вот implement интерфейсов - может, сколько угодно.Ответ 4
Насколько я знаю, интерфейсы в java могут содержать только абстрактные методы и никакой реализации. В них нет конструкторов. В абстрактном классе может быть 1 или больше абстрактных методов, и также он может иметь методы с реализацией. В АК есть конструктор. Класс может наследовать много интерфейсов, но только один класс. Пишу на Scala, там используются трейты вместо интерфейсов. Вышесказанное относится и к трейтам тоже, но там еще можно прокинуть type class в него, и плюс в нем могут быть абстрактные и реализованные методы.
Комментариев нет:
Отправить комментарий