Try English version of Quizful



Раздаем бесплатные Q! подробности в группе Quizful.Alpha-test
Партнеры
Рекрутерам: Прескрининг кандидатов about
Топ контрибуторов
loading
loading
Знаете ли Вы, что

После прохождения теста можно комментировать вопросы теста, а Ваши комментарии увидят модераторы теста и пользователи, которым когда-либо эти вопросы попадались.

Лента обновлений
ссылка 15:38:56
Добавлен вопрос в тест C# - Средний уровень
ссылка 15:11:57
Добавлен вопрос в тест C# - Средний уровень
ссылка 15:03:58
Добавлен вопрос в тест C# - Средний уровень
ссылка 14:51:10
Комментарий от olegchap:
Совершенно правы. Опечатка. Спасибо за сигнал. Исправил...
ссылка 12:12:41
Комментарий от lenarikil:
"Вы как нибудь сами скомпилируйте, а то у меня лапки" ...
Статистика

Тестов: 153, вопросов: 8581. Пройдено: 393520 / 1913908.

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

head tail Статья
категория
Java
дата21.05.2013
авторspayker
голосов24

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

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

Критерии сравнения
Интерфейс
Абстрактный класс
Наследование классов
Класс может реализовать (implement) множество интерфейсов
Класс может наследовать только один абстрактный класс.
Поля данных
Интерфейс может содержать только общедоступные константы (public final static long SOME_CONST = 1)
Абстрактный класс может содержать любые поля: статические и экземплярные, константы, private/protected/public
Модификаторы доступа методов
Методы в интерфейсе могут иметь модификаторы только public  и abstract. По-умолчанию они уже public abstract
К неабстрактным членам класса применимы любые модификаторы. Однако абстрактные методы (с модификатором abstract) могут иметь либо public, либо protected модификатор. Иными словами абстрактные методы не могут быть приватными.
Реализация объявленных методов
Интерфейс не может содержать никакой реализации методов.
Абстрактный класс допускает реализацию методов
Описание конструктора
Интерфейс не может содержать никаких конструкторов
В абстрактном классе можно описать конструктор (или несколько конструкторов).

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

1) Абстрактный класс уместно использовать, если вы собираетесь использовать наследование, которое будет обеспечивать общую структуру.
2) Абстрактный класс также уместно использовать, если вы хотите объявить приватные экземпляры. В интерфейсах, все методы должны быть публичными.
3) Если вы считаете, что в будущем вам понадобится прибегать к добавлению новых методов, тогда абстрактный класс – лучший вариант. В случае интерфейса вам необходимо будет объявлять новый метод в каждом классе, который реализует ваш интерфейс.
4) Интерфейсы – хороший выбор, если вам известно, что API не будет меняться некоторое время.
5) Также, для реализации «множественного наследования» кроме интерфейсов вы не найдете альтернативных решений.

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

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

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

Полезные ресурсы

"Java 2. Том I. Библиотека профессионала." Г. Корнелл, Кей Хорстманн;
"Java. Полное руководство." Г. Шилдт;
"Effective Java, Second edition" Joshua Bloch;
Интерфейсы vs. классы - http://habrahabr.ru/post/30444/

Если Вам понравилась статья, проголосуйте за нее

Голосов: 24  loading...
AlexVovolka   dezmond   GalaranF   ig_master   SichikUA   l30091994   Akoemov   orion07   katch   tamillochka   McKey92   iliyaboev   andrik92   vvkvvk   SnowWhite   polinkot   Victor_MM   SmartChicken   pr4yer   SamTan   mrhyman63   znatok   anderwerty   Sawjkee