Интерфейс (Java)

редактировать

интерфейс в языке программирования Java является абстрактным тип, который используется для указания поведения, которое должны реализовать классы . Они похожи на протоколы. Интерфейсы объявляются с использованием ключевого слова interface и могут содержать только сигнатуру метода и объявления констант (объявления переменных, которые объявлены как статические и конечные ). Все методы интерфейса не содержат реализации (тела методов), как во всех версиях ниже Java 8. Начиная с Java 8, методы defaultи staticмогут иметь реализацию в определение интерфейса. Затем в Java 9 были добавлены методы privateи private static. В настоящее время интерфейс Java может иметь до шести различных типов.

Интерфейсы не могут быть созданы, они скорее реализованы. Класс, реализующий интерфейс, должен реализовывать все методы, не используемые по умолчанию, описанные в интерфейсе, или быть абстрактным классом . Ссылки на объекты в Java могут быть указаны как интерфейсные; в каждом случае они должны иметь значение null или быть привязанными к объекту, реализующему интерфейс.

Одним из преимуществ использования интерфейсов является то, что они имитируют множественное наследование. Все классы в Java должны иметь ровно один базовый класс, за исключением java.lang.Object (корневой класс Система типов Java ); множественное наследование классов не допускается. Однако интерфейс может наследовать несколько интерфейсов, а класс может реализовывать несколько интерфейсов.

Содержание

  • 1 Обзор
  • 2 Использование
    • 2.1 Определение интерфейса
    • 2.2 Реализация интерфейсов в классе
    • 2.3 Субинтерфейсы
  • 3 Примеры
  • 4 См. Также
  • 5 Ссылки
  • 6 Внешние ссылки

Обзор

Интерфейсы используются для кодирования сходств, которые разделяют классы различных типов, но не обязательно составляют отношения классов. Например, человек и попугай могут свистеть ; однако было бы бессмысленно представлять Humanи Parrotкак подклассы класса Whistler. Скорее всего, они будут подклассами класса Animal(вероятно, с промежуточными классами), но оба будут реализовывать интерфейс Whistler.

Другое использование интерфейсов - это возможность использовать объект без знания его типа класса, а только то, что он реализует определенный интерфейс. Например, если кого-то раздражает свистящий звук, он может не знать, человек это или попугай, потому что все, что можно определить, - это то, что свистит свист. Вызов whistler.whistle ()вызовет реализованный метод whistleобъекта whistlerнезависимо от того, какой у него класс, при условии, что он реализует Whistler. В более практическом примере алгоритм сортировки может ожидать объект типа Comparable . Таким образом, не зная конкретного типа, он знает, что объекты этого типа можно каким-то образом отсортировать.

Например:

интерфейс Bounceable {double pi = 3.1415; void setBounce (); // Обратите внимание на точку с запятой // Методы интерфейса общедоступны, абстрактны и никогда не являются окончательными. // Думайте о них только как о прототипах; никакие реализации не допускаются. }

Интерфейс:

  • объявляет только заголовки методов и общедоступные константы.
  • не может быть создан.
  • может быть реализован классом.
  • не может расширять class.
  • может расширять несколько других интерфейсов.

Использование

Определение интерфейса

Интерфейсы определяются с помощью следующего синтаксиса (сравните с определением класса Java ):

[видимость] интерфейс InterfaceName [расширяет другие интерфейсы] {объявления констант объявления абстрактных методов}

Пример: открытый интерфейс Interface1 расширяет Interface2;

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

Таким образом, простой интерфейс может быть

открытым интерфейсом Predator {boolean chasePrey (Prey p); пустота eatPrey (Prey p); }

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

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

Синтаксис для реализации interface использует эту формулу:

... реализует InterfaceName [, другой интерфейс, другой,...]...

Классы могут реализовывать интерфейс. Например:

публичный класс Lion реализует Predator {@Override public boolean chasePrey (Prey p) {// Программирование на преследование добычи p (специально для льва)} @Override public void eatPrey (Prey p) {// Программирование на съесть добычу p (специально для льва)}}

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

Классы могут реализовывать несколько интерфейсов:

открытый класс Frog реализует Predator, Prey {...}

Интерфейсы могут использовать общие методы класса:

класс Animal реализует LikesFood, LikesWater {boolean like () {вернуть истину; }}

Однако данный класс не может реализовывать один и тот же или похожий интерфейс несколько раз:

класс Animal реализует Shares , Shares ... // Ошибка: повторяющийся интерфейс

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

Субинтерфейсы

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

открытый интерфейс VenomousPredator расширяет Predator, Venomous {// тело интерфейса}

является допустимым и определяет подинтерфейс. В отличие от классов, он допускает множественное наследование. Predatorи Venomousмогут определять или унаследовать методы с одной и той же сигнатурой, скажем, kill (Prey p). Когда класс реализует VenomousPredator, он реализует оба метода одновременно.

Примеры

Некоторые распространенные интерфейсы Java :

  • Comparable имеет метод compareTo , который используется для описания двух объектов как равных или для обозначения того, что один из них больше другого. Generics позволяют реализовать классы, чтобы указать, какие экземпляры классов можно сравнивать с ними.
  • Serializable - это интерфейс маркера без методов или полей - он имеет пустое тело. Он используется, чтобы указать, что класс может быть сериализован. Его Javadoc описывает, как он должен функционировать, хотя ничего не реализуется программно

См. Также

Ссылки

Внешние ссылки

Последняя правка сделана 2021-05-24 04:11:49
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте