Что значит реализовывать интерфейс

Интерфейсы Java

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

Автор: Khalid Andari
Дата записи

1. Обзор

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

2. Что такое интерфейсы в Java?

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

Давайте рассмотрим простой пример интерфейса на Java:

Мы можем реализовать интерфейс в классе Java с помощью ключевого слова implements .

Далее, давайте также создадим Компьютерный класс, реализующий Электронный интерфейс, который мы только что создали:

2.1. Правила создания интерфейсов

В интерфейсе нам разрешено использовать:

  • константы переменные
  • абстрактные методы
  • статические методы
  • методы по умолчанию

Мы также должны помнить, что:

  • мы не можем создавать экземпляры интерфейсов напрямую
  • интерфейс может быть пустым, в нем нет методов или переменных
  • мы не можем использовать слово final в определении интерфейса, так как это приведет к ошибке компилятора
  • все объявления интерфейса должны иметь модификатор доступа public или по умолчанию; модификатор abstract будет добавлен компилятором автоматически
  • метод интерфейса не может быть закрытым , защищенным или окончательным
  • переменные интерфейса являются общедоступными , статическими и окончательными по определению; нам не разрешается изменять их видимость

3. Чего Мы Можем Достичь, используя Их?

3.1. Поведенческая функциональность

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

Для получения дополнительной информации, пожалуйста, посетите наш учебник по Comparator и Comparable на Java.

3.2. Множественное Наследование

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

Например, в приведенном ниже примере мы замечаем, что Car класс реализует интерфейсы Fly и Transform . Поступая таким образом, он наследует методы fly и transform :

3.3. Полиморфизм

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

В Java мы можем достичь полиморфизма с помощью интерфейсов. Например, интерфейс Shape может принимать различные формы — это может быть Круг или Квадрат.

Давайте начнем с определения Формы интерфейса:

Теперь давайте также создадим класс Circle :

А также Квадрат класс:

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

4. Методы по умолчанию в интерфейсах

Традиционные интерфейсы в Java 7 и ниже не обеспечивают обратную совместимость.

Это означает, что если у вас есть устаревший код, написанный на Java 7 или более ранней версии, и вы решили добавить абстрактный метод в существующий интерфейс, то все классы, реализующие этот интерфейс, должны переопределить новый абстрактный метод . В противном случае код будет нарушен.

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

5. Правила Наследования интерфейса

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

5.1. Интерфейс, Расширяющий Другой Интерфейс

Когда интерфейс расширяет другой интерфейс, он наследует все абстрактные методы этого интерфейса. Давайте начнем с создания двух интерфейсов, Имеющих цвет и Форму :

В приведенном выше примере Поле наследуется от Имеет цвет с использованием ключевого слова расширяется. Таким образом, интерфейс Box наследует getColor . В результате интерфейс Box теперь имеет два метода: getColor и getHeight .

5.2. Абстрактный класс, реализующий интерфейс

Когда абстрактный класс реализует интерфейс, он наследует все свои абстрактные методы и методы по умолчанию. Давайте рассмотрим интерфейс Transform и абстрактный класс Транспортное средство , который его реализует:

В этом примере класс Vehicle наследует два метода: метод abstract transform и метод по умолчанию Спецификации печати .

6. Функциональные Интерфейсы

Java с самого начала имела множество функциональных интерфейсов, таких как Сопоставимый (начиная с Java 1.2) и Управляемый (начиная с Java 1.0).

Java 8 представила новые функциональные интерфейсы, такие как Предикат , Потребитель и Функция . Чтобы узнать больше об этом, пожалуйста, посетите наш учебник по Функциональным интерфейсам в Java 8 .

7. Заключение

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

Как всегда, полные образцы кода доступны на GitHub.

Источник

Интерфейсы в Java и немного о полиморфизме

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

Новички часто спрашивают, чем интерфейс отличается от абстрактного класса. Интерфейсы в Java компенсируют отсутствие множественного наследования классов. У класса-потомка может быть только один абстрактный класс-родитель, а вот интерфейсов класс может применять (имплементировать) сколько угодно.

Интерфейс на Java объявляют примерно так же, как и класс:

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

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

Функциональный интерфейс Java

Если у интерфейса только один абстрактный метод, перед нами функциональный интерфейс. Его принято помечать аннотацией @FunctionalInterface, которая указывает компилятору, что при обнаружении второго абстрактного метода в этом интерфейсе нужно сообщить об ошибке. Стандартных (default) методов у интерфейса может быть множество – в том числе принадлежащих классу java.lang.Object.

Как выглядит функциональный интерфейс на Java:

Функциональные интерфейсы появились в Java 8. Они обеспечили поддержку лямбда-выражений, использование которых делает код лаконичным и понятным:

В той же версии появились пакеты встроенных интерфейсов: java.util.function и java.util.stream.

Реализация интерфейсов классами Java

Допустим, есть интерфейс Edible, которым пользуются классы Fruit, Vegetable, Fish. Экземпляры этих классов можно создавать так:

Хорошим тоном считается давать интерфейсам названия с окончанием -able/-ible — это показывает, что с объектами, имплементирующими интерфейс, можно что-то делать: Edible (можно есть), Moveable (можно двигать), Clickable (реагирует на клик) и т.д.

Обратите внимание на разницу в конструкторах: для фруктов задаём название и сорт, для рыбы – название, район вылова и вес порции в граммах. Но ссылки на оба объекта храним в переменных одного типа – «Съестное».

Интерфейсы и полиморфизм

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

В Java полиморфизм можно реализовать через:

  • наследование — с переопределением параметров и методов базового класса;
  • абстрактные классы — шаблоны для раздельной реализации в разных классах;
  • интерфейсы — для имплементации классами.

Интерфейс выручает в ситуации, когда при создании переменной мы не знаем, объект какого класса ей будет присвоен.

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

Новички часто спрашивают, чем интерфейс отличается от абстрактного класса. Интерфейсы в Java компенсируют отсутствие множественного наследования классов. У класса-потомка может быть только один абстрактный класс-родитель, а вот интерфейсов класс может применять (имплементировать) сколько угодно.

Интерфейс на Java объявляют примерно так же, как и класс:

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

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

Функциональный интерфейс Java

Если у интерфейса только один абстрактный метод, перед нами функциональный интерфейс. Его принято помечать аннотацией @FunctionalInterface, которая указывает компилятору, что при обнаружении второго абстрактного метода в этом интерфейсе нужно сообщить об ошибке. Стандартных (default) методов у интерфейса может быть множество – в том числе принадлежащих классу java.lang.Object.

Как выглядит функциональный интерфейс на Java:

Функциональные интерфейсы появились в Java 8. Они обеспечили поддержку лямбда-выражений, использование которых делает код лаконичным и понятным:

В той же версии появились пакеты встроенных интерфейсов: java.util.function и java.util.stream.

Реализация интерфейсов классами Java

Допустим, есть интерфейс Edible, которым пользуются классы Fruit, Vegetable, Fish. Экземпляры этих классов можно создавать так:

Хорошим тоном считается давать интерфейсам названия с окончанием -able/-ible — это показывает, что с объектами, имплементирующими интерфейс, можно что-то делать: Edible (можно есть), Moveable (можно двигать), Clickable (реагирует на клик) и т.д.

Обратите внимание на разницу в конструкторах: для фруктов задаём название и сорт, для рыбы – название, район вылова и вес порции в граммах. Но ссылки на оба объекта храним в переменных одного типа – «Съестное».

Интерфейсы и полиморфизм

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

В Java полиморфизм можно реализовать через:

  • наследование — с переопределением параметров и методов базового класса;
  • абстрактные классы — шаблоны для раздельной реализации в разных классах;
  • интерфейсы — для имплементации классами.

Интерфейс выручает в ситуации, когда при создании переменной мы не знаем, объект какого класса ей будет присвоен.

Источник

Явная реализация интерфейса (Руководство по программированию в C#)

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

Следующий пример вызывает методы:

Но может потребоваться, чтобы одна и та же реализация вызывалась для обоих интерфейсов. Чтобы вызывать разную реализацию в зависимости от используемого интерфейса, можно явно реализовать член интерфейса. Явная реализация интерфейса — это член класса, который вызывается только через указанный интерфейс. Укажите имя интерфейса и точку в качестве префикса в имени члена класса. Пример:

Член класса IControl.Paint доступен только через интерфейс IControl , а ISurface.Paint — только через интерфейс ISurface . Обе реализации метода будут разделены, и ни одна из них не будет доступна в классе напрямую. Пример:

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

Явная реализация интерфейса не имеет модификатора доступа, так как она недоступна в качестве члена типа, в котором определена. Вместо этого она доступна только при вызове через экземпляр интерфейса. При указании модификатора доступа для явной реализации интерфейса возникает ошибка компилятора CS0106. Дополнительные сведения см. в разделе interface (справочник по C#).

Начиная с версии C# 8.0, вы можете определять реализацию для членов, объявленных в интерфейсе. Если класс наследует реализацию метода от интерфейса, этот метод доступен только через ссылку типа интерфейса. Наследуемый член не отображается как часть открытого интерфейса. Следующий пример определяет реализацию по умолчанию для метода интерфейса:

Следующий пример вызывает реализацию по умолчанию:

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

Источник

Читайте также:  Прозелит что это значит
Оцените статью