Интерфейсы в Java. Полное руководство

Интерфейсы в Java. Полное руководство

Интерфейсы являются основной частью языка программирования Java. Кроме JDK они используются еще и в шаблонах проектирования, а также множестве различных инструментах и фреймворках. Также интерфейсы обеспечивают абстракцию в Java.

Например, нам нужно создать рисунок, который состоит из нескольких фигур. Для этого мы можем создать интерфейс Shape и определить методы для работы с объектами Shape. Для простоты, давайте определим только два метода — draw() - чтобы нарисовать фигуру и метод getArea() , который будет возвращать площадь фигуры.

Пример Java интерфейса

На основании вышеуказанных требований, наш интерфейс Shape будет выглядеть следующим образом:

Shape.java

Основная информация об интерфейсах в Java

  • interface — ключевое слово для создания интерфейса в Java.
  • Создать экземпляр интерфейса в Java нельзя.
  • Интерфейс обеспечивает абсолютную абстракцию. В прошлых постах мы узнали об абстрактных классах в Java, которые также обеспечивают абстракцию, но абстрактные классы могут иметь реализаций метода, а интерфейс не может.
  • Интерфейсы не могут иметь конструкторов, потому что мы не можем создать экземпляр интерфейса. Также интерфейсы не могут иметь методы с реализацией.
  • По умолчанию любой атрибут интерфейса является public, static и final, так что нам не нужно определять модификаторы доступа к атрибутам. Если же вы попробуете это сделать, то компилятор жаловаться не будет.
  • По умолчанию методы интерфейса неявно abstract и public. Это очень умное решение, потому что в интерфейсе метод не имеет реализации — этим занимаются подклассы, реализующие этот интерфейс.
  • Интерфейс в Java не может быть подклассом у другого класса, но он может реализовать другой интерфейс. public interface Shape extends Cloneable{} - пример интерфейса, который наследует другой интерфейс. На самом деле Java обеспечивает множественное наследование интерфейсов — это означает, что интерфейс может наследовать несколько интерфейсов.
  • Ключевое слово implements используется классами для реализации интерфейса.
  • Класс, реализующий интерфейс, должен обеспечить реализацию всех его метода, если только это не абстрактный класс. Например, мы можем реализовать наш интерфейс в абстрактном классе. Вот пример:

ShapeAbs.java

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

Пример реализации интерфейса на Java

Теперь давайте посмотрим на реализацию интерфейса Shape:

Circle.java

Обратите внимание, что класс Circle реализует все методы, определенные в интерфейсе, а также собственный метод getRadius(). Реализация интерфейса может иметь несколько типов конструкторов. Давайте посмотрим другую реализацию интерфейса Shape.

Rectangle.java

А теперь напишем программу для тестирования реализаций нашего интерфейса.

ShapeTest.java

Результат работы программы будет такой:

Преимущества интерфейсов в Java

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

Недостатки интерфейсов в Java

Хотя интерфейсы дают программисту множество преимуществ, они также имеют и недостатки.

  • Мы должны очень тщательно выбирать методы интерфейса во время проектирования любого проекта, потому что мы не можем добавить или удалять методы из интерфейса на более поздних этапах реализации проекта. Если же вы захотите удалить какие-то методы с интерфейса, то это приведет к ошибке компиляции во всех классах, которые реализуют интерфейс. Чтобы избежать этого, обычно создают множество интерфейсов, расширяющих базовый интерфейс, что усложняет поддержку такого кода.
  • Если классы, которые реализуют интерфейс, имеют свои собственные методы, мы не можем использовать их непосредственно в коде, потому что тип объекта определяет интерфейс, у которого нет таких методов. Например, в таком коде мы получим ошибку компиляции кода для shape.getRadius(). Чтобы избежать ошибки, мы можем использовать приведение типов:
Хотя приведение типов также имеет свои недостатки.

Интересно знать, что в Java 8 в интерфейсах появилась возможность определения методов по умолчанию, а также реализация статических методов в интерфейсах. Читайте об этом в следующих статьях на Javadevblog.com

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *