Абстрактный класс против интерфейса: различия и сходства

Опубликовано: 2021-06-02

Если вы сидите на собеседовании по разработке программного обеспечения, единственный вопрос, который вы можете ожидать, — это различия и сходства между абстрактным классом и интерфейсом.

Абстрактные классы и интерфейсы являются фундаментальными блоками объектно-ориентированного программирования. Оба они позволяют программистам реализовать одну из наиболее важных концепций ООП — абстракцию. Хотя абстрактные классы и интерфейсы используются для реализации концепции абстракции, они различаются по реализации и имеют разные варианты использования. Абстрактные классы и интерфейсы могут показаться новичку похожими, но их нельзя использовать взаимозаменяемо.

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

К концу этой статьи вы сможете четко различать абстрактные классы и интерфейсы, а также то, что нужно реализовать для конкретных случаев.

Оглавление

Интерфейсы — что это?

Интерфейс в ООП можно понимать просто как поведенческий контракт между различными системами. Это означает, что любой класс, реализующий интерфейс, должен предоставлять некоторую реализацию для всех методов интерфейса.

Все методы в интерфейсе должны быть общедоступными и абстрактными. Поэтому интерфейсы также понимаются как «чисто абстрактные» классы.

Определение интерфейсов выглядит так:

общедоступный интерфейс

публичное жевание пустоты();

общественное переваривание пустот();

}

Как видите, определение включает добавление перед именем ключевого слова interface . Кроме того, в этом интерфейсе определены два абстрактных общедоступных метода, поэтому класс, реализующий описанный выше интерфейс, должен будет обеспечить реализацию функций жевания() и переваривания(); функции.

Теперь давайте посмотрим, что такое абстрактные классы, а затем объединим оба понятия, чтобы вы лучше поняли их сходства и различия.

Абстрактные классы — что это?

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

Вот как выглядит определение абстрактных классов:

общедоступный абстрактный класс Eating {

общественная недействительность getReady () {

System.out.println("Я готов есть");

}

публичный абстрактный недействительный старт();

публичная абстрактная недействительная остановка();

}

Как видно из определения абстрактного класса, функция getReady() не является абстрактной, а функция start(); и стоп(); функции абстрактны.

Когда дело доходит до реализации абстрактных классов, вы должны знать несколько правил:

  • Абстрактные классы не могут быть созданы. Это означает, что мы не можем создавать объекты из каких-либо абстрактных классов.
  • Любой дочерний класс, который расширит абстрактный класс, должен реализовать все абстрактные методы, описанные в абстрактном классе. Если дочерний класс не реализует все абстрактные методы, дочерний класс также должен быть объявлен как абстрактный класс.

Теперь, когда у нас есть основы интерфейсов и абстрактных классов, давайте поговорим о том, чем они отличаются, чем они похожи и когда какой подход следует использовать.

Различия и сходства между интерфейсами и абстрактными классами

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

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

Вот сводка всех ключевых различий между абстрактным классом и интерфейсом.

Параметр Абстрактные классы Интерфейсы
Ключевое слово используется абстрактное ключевое слово. используется ключевое слово интерфейса .
Тип переменных Может обрабатывать окончательные, не окончательные, статические и нестатические переменные. Может иметь только статические и конечные переменные, определенные по умолчанию.
Окончательные переменные В нем могут быть объявлены или не объявлены переменные final. Переменные по умолчанию объявлены как final
Модификаторы доступа Может иметь все любые модификаторы — приватные, общедоступные, статические и т.д. Может иметь только модификатор общего доступа.
Типы методов Может иметь как абстрактные, так и неабстрактные методы. Может иметь только абстрактные методы.
Скорость Быстро Медленно, так как требует дополнительной косвенности.

Абстрактный класс против интерфейса: когда что выбрать?

Если вам нужен базовый класс для реализации некоторых реализаций в вашем коде, вам подойдет абстрактный класс. Например, вы можете захотеть инициализировать несколько переменных внутри класса для выполнения некоторого логического действия в методе, который могут использовать все производные классы. В таком случае лучше всего использовать абстрактный класс.

Однако, если вам нужно предоставить какое-либо дополнительное поведение для ваших классов, вам следует выбрать интерфейсы. На самом деле и интерфейсы, и абстрактные классы предлагают вам одинаковую функциональность. Однако разница возникает, когда вы рассматриваете стандарты кодирования. Интерфейсы помогают достичь абстракции и полиморфизма — двух важных принципов ООП. Это также позволяет сохранять слабосвязанный код, а не сильно связанный.

Давайте теперь подведем итоги использования интерфейсов и абстрактных классов!

Когда использовать интерфейсы?

Интерфейс позволяет программистам создавать дополнительные модели поведения для своих классов. Это позволяет кому-то начать с нуля и реализовать интерфейс в любом классе, который он хочет. Таким образом, цель интерфейса второстепенна — это то, что нужно добавить в код. Итак, в тех случаях, когда вы хотите предоставить дополнительные функциональные возможности классам и не возражаете против раскрытия методов вашего интерфейса (поскольку все методы будут общедоступными), вам следует приступить к реализации интерфейса.

Когда использовать абстрактные классы?

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

Изучайте онлайн -курсы по разработке программного обеспечения в лучших университетах мира. Участвуйте в программах Executive PG, Advanced Certificate Programs или Master Programs, чтобы ускорить свою карьеру.

В заключение

Абстракция является важнейшим компонентом ООП, и как абстрактные классы, так и интерфейсы позволяют вам достичь некоторой степени абстракции в вашем коде. Однако их взаимозаменяемое использование без знания плюсов и минусов является ошибкой и может привести к тому, что ваш код (и, в конечном итоге, ваше программное обеспечение) будет содержать ошибки и задержки.

Мы надеемся, что эта статья помогла вам понять принципиальные различия между абстрактными классами и интерфейсами, а также некоторые сведения о синтаксисе и местах их реализации.

Если вам интересно узнать больше об абстрактных классах и интерфейсах , ознакомьтесь с программой upGrad & IIIT-B Executive PG по разработке программного обеспечения с полным стеком, которая предназначена для работающих профессионалов и предлагает более 500 часов тщательного обучения, более 9 проектов и заданий. , статус выпускника IIIT-B, практические практические проекты и помощь в трудоустройстве в ведущих фирмах.

Если вы все еще не уверены в нюансах, напишите нам комментарий ниже, и мы скоро свяжемся с вами!

Что такое абстрактный класс в Java?

Абстрактный класс — это класс, который не может быть создан и не может быть унаследован. Сам по себе он не имеет значительных операций и действует только как суперкласс для конкретных классов. Он используется только для обеспечения специализации. Рассмотрим на примере класса Car и его подклассов спортивный автомобиль и хэтчбек. Абстрактный класс Car можно рассматривать как родительский класс для всех подклассов.

Когда использовать абстрактный класс в Java?

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

В чем разница между абстрактным классом и интерфейсом в Java?

Абстрактный класс и интерфейс — это два способа определения класса, которые содержат некоторые, но не все методы для реализации класса. Эти два статически различны и достигаются по-разному. Но с точки зрения динамического использования они одинаковы. Интерфейс — это просто класс, который содержит только константы и объявления абстрактных методов. В Java нет фактической реализации интерфейса. Таким образом, интерфейсы — это полностью фиктивные классы. Интерфейсы используются для определения контрактов методов и констант в классе. Это заставит класс реализовать те же методы и константы. Метод может быть реализован либо в абстрактном классе, либо в подклассах. Абстрактный класс — это класс, который содержит абстрактные методы. Подклассы реализуют эти абстрактные методы. Абстрактный класс и интерфейс могут использоваться вместе для обеспечения соблюдения определенных контрактов в классе.