Интерфейс на языке программирования Java является абстрактным типом , который используется для указания поведения , которое классы должны реализовать. Они похожи на протоколы . Интерфейсы объявляются с использованием interface
ключевого слова и могут содержать только сигнатуру метода и объявления констант (объявления переменных, которые объявлены как static
и final
). Все методы интерфейса не содержат реализации (тела методов), как во всех версиях ниже Java 8. Начиная с Java 8, default
и static
методы могут иметь реализацию в interface
определении. [1] Затем в Java 9 private
иprivate static
были добавлены методы. В настоящее время интерфейс Java может иметь до шести различных типов.
Интерфейсы не могут быть созданы , а скорее реализованы. Класс, реализующий интерфейс, должен реализовывать все методы, не используемые по умолчанию, описанные в интерфейсе, или быть абстрактным классом . Ссылки на объекты в Java могут быть указаны как интерфейсные; в каждом случае они должны быть либо нулевыми , либо быть привязанными к объекту, реализующему интерфейс.
Одним из преимуществ использования интерфейсов является то, что они имитируют множественное наследование . Все классы в Java должны иметь ровно один базовый класс , за единственным исключением java.lang.Object
( корневой класс системы типов Java ); множественное наследование классов не допускается. Однако интерфейс может наследовать несколько интерфейсов, а класс может реализовывать несколько интерфейсов.
Обзор [ править ]
Интерфейсы используются для кодирования сходства, которое разделяют классы различных типов, но не обязательно составляют отношения классов. Например, свистеть могут и человек, и попугай ; однако было бы нецелесообразно представлять s и s как подклассы класса. Скорее всего, они будут подклассами класса (вероятно, с промежуточными классами), но оба будут реализовывать интерфейс.Human
Parrot
Whistler
Animal
Whistler
Другое использование интерфейсов - это возможность использовать объект, не зная его типа класса, а только то, что он реализует определенный интерфейс. Например, если кого-то раздражает свистящий звук, он может не знать, человек это или попугай, потому что все, что можно определить, - это то, что свистит свист. Вызов whistler.whistle()
вызовет реализованный метод whistle
объекта whistler
независимо от того, какой у него класс, при условии, что он реализует Whistler
. В более практическом примере алгоритм сортировки может ожидать объект типа Comparable
. Таким образом, не зная конкретного типа, он знает, что объекты этого типа можно каким-то образом отсортировать.
Например:
интерфейс Bounceable { двойной пи = 3,1415 ; void setBounce (); // Обратите внимание на точку с запятой // Методы интерфейса общедоступны, абстрактны и никогда не являются окончательными. // Думайте о них только как о прототипах; никакие реализации не допускаются. }
Интерфейс:
- объявляет только заголовки методов и общедоступные константы.
- не может быть создан.
- может быть реализован классом.
- не может расширить класс.
- может расширять несколько других интерфейсов.
Использование [ править ]
Определение интерфейса [ править ]
Интерфейсы определяются следующим синтаксисом (сравните с определением класса Java ):
[ видимость ] interface InterfaceName [расширяет другие интерфейсы ] { объявления констант объявления абстрактных методов}
Пример: открытый интерфейс Interface1 расширяет Interface2;
Тело интерфейса содержит абстрактные методы , но поскольку все методы в интерфейсе по определению являются абстрактными, abstract
ключевое слово не требуется. Поскольку интерфейс определяет набор открытых поведений, все методы являются неявными public
.
Таким образом, простой интерфейс может быть
открытый интерфейс Predator { логическое chasePrey ( Prey p ); void eatPrey ( Prey p ); }
Объявления типа члена в интерфейсе неявно являются статическими, окончательными и общедоступными, но в остальном они могут быть любым типом класса или интерфейса. [2]
Реализация интерфейсов в классе [ править ]
В синтаксисе реализации интерфейса используется эта формула:
... реализует InterfaceName [, другой интерфейс , другой , ...] ...
Классы могут реализовывать интерфейс. Например:
открытый класс Lion реализует Predator { @Override public boolean chasePrey ( Prey p ) { // Программирование на преследование добычи p (специально для льва) } @Override public void eatPrey ( Prey p ) { // Программирование на есть добычу p (специально для льва) } }
Если класс реализует интерфейс и не реализует все его методы, он должен быть помечен как abstract
. Если класс является абстрактным, ожидается , что один из его подклассов будет реализовывать его нереализованные методы, хотя, если какой-либо из подклассов абстрактного класса не реализует все методы интерфейса, сам подкласс должен быть снова помечен как abstract
.
Классы могут реализовывать несколько интерфейсов:
открытый класс Frog реализует Predator , Prey { ... }
Интерфейсы могут использовать общие методы класса:
класс Animal реализует LikesFood , LikesWater { логическое значение любит () { return true ; } }
Однако данный класс не может реализовывать один и тот же или подобный интерфейс несколько раз:
class Animal реализует Shares < Boolean > , Shares < Integer > ... // Ошибка: повторяющийся интерфейс
Интерфейсы обычно используются на языке Java для обратных вызовов , [3] как это делает Java не допускают множественное наследование классов, а также не допускает прохождение методов (процедур) в качестве аргументов. Следовательно, чтобы передать метод в качестве параметра целевому методу, текущая практика состоит в том, чтобы определить и передать ссылку на интерфейс в качестве средства предоставления подписи и адреса метода параметра целевому методу, а не определять несколько вариантов. целевого метода для размещения каждого возможного вызывающего класса.
Подынтерфейсы [ править ]
Интерфейсы могут расширять несколько других интерфейсов, используя ту же формулу, которая описана ниже. Например,
открытый интерфейс VenomousPredator расширяет Predator , Venomous { // тело интерфейса }
является законным и определяет подинтерфейс. В отличие от классов, он допускает множественное наследование. Predator
и, Venomous
возможно, может определять или наследовать методы, скажем, с той же сигнатурой kill(Prey p)
. Когда класс реализует, VenomousPredator
он реализует оба метода одновременно.
Примеры [ править ]
Вот некоторые распространенные интерфейсы Java :
Comparable
имеет методcompareTo
, который используется для описания двух объектов как равных или для обозначения того, что один из них больше другого. Обобщения позволяют реализовать классы, чтобы указать, какие экземпляры классов можно сравнивать с ними.Serializable
это интерфейс маркера без методов или полей - он имеет пустое тело. Он используется, чтобы указать, что класс может быть сериализован . Его Javadoc описывает, как он должен работать, хотя ничего программно не применяется
См. Также [ править ]
- Mixin
- Черта (компьютерное программирование)
Ссылки [ править ]
- ^ «Методы по умолчанию» . Архивировано из оригинала на 2017-05-23 . Проверено 30 июня 2014 .
- ^ «Спецификация языка Java» .
- ↑ Митчелл, Джон Д. (1 июня 1996 г.). «Совет по Java 10: Реализуйте процедуры обратного вызова на Java» . JavaWorld . Проверено 14 июля 2020 .
Внешние ссылки [ править ]
- Что такое интерфейс?