Интерфейс (Java)
Интерфейс должны в языке программирования Java — это абстрактный тип , который используется для объявления поведения, которое реализовывать классы . Они похожи на протоколы . Интерфейсы объявляются с использованием interface
ключевое слово и может содержать только сигнатуру метода и объявления констант (объявления переменных, которые объявлены как static
и final
). Все методы интерфейса не содержат реализации (тела методов) во всех версиях ниже Java 8. Начиная с Java 8, default
[1] : 99 и static
[1] : 7 методы могут иметь реализацию в interface
определение. [2] Затем в Java 9 private
и private static
были добавлены методы. В настоящее время интерфейс Java может иметь до шести различных типов.
Интерфейсы не могут быть созданы , а реализованы. Класс, реализующий интерфейс, должен реализовывать все нестандартные методы, описанные в интерфейсе, или быть абстрактным классом . Ссылки на объекты в Java могут быть указаны как интерфейсные; в каждом случае они должны иметь значение null или быть привязаны к объекту, реализующему интерфейс.
Одним из преимуществ использования интерфейсов является то, что они имитируют множественное наследование . Все классы в Java должны иметь ровно один базовый класс , за исключением java.lang.Object
( корневой класс Java системы типов ); множественное наследование классов не допускается. Однако интерфейс может наследовать несколько интерфейсов, а класс может реализовывать несколько интерфейсов.
Обзор
[ редактировать ]Интерфейсы используются для кодирования сходств, которые разделяют классы различных типов, но не обязательно образуют классовые отношения. Например, и человек , и попугай могут свистеть ; однако не имело бы смысла представлять Human
песок Parrot
s как подклассы Whistler
сорт. Скорее всего, они являются подклассами Animal
класс (вероятно, с промежуточными классами), но оба будут реализовывать Whistler
интерфейс.
Другое использование интерфейсов — это возможность использовать объект , не зная его типа класса, а только то, что он реализует определенный интерфейс. Например, если кого-то раздражает свистящий звук, он может не знать, человек это или попугай, потому что все, что можно определить, это то, что свистит свистун. Звонок whistler.whistle()
вызовет реализованный метод whistle
объекта whistler
независимо от того, какой у него класс, при условии, что он реализует Whistler
. В более практическом примере алгоритм сортировки может ожидать объект типа Comparable
. Таким образом, не зная конкретного типа, он знает, что объекты этого типа можно каким-то образом отсортировать.
Например:
interface Bounceable { double pi = 3.1415; void setBounce(); // Note the semicolon // Interface methods are public, abstract and never final. // Think of them as prototypes only; no implementations are allowed.}
Интерфейс:
- объявляет только заголовки методов и общедоступные константы.
- не может быть создан экземпляр.
- может быть реализован классом. [1] : 75
- не может расширить класс.
- может расширять несколько других интерфейсов. [1] : 87
Использование
[ редактировать ]Определение интерфейса
[ редактировать ]Интерфейсы определяются с помощью следующего синтаксиса (сравните с определением класса Java ):
[visibility] interface InterfaceName [extends other interfaces] { constant declarations abstract method declarations static method declarations}
Пример: общедоступный интерфейс Interface1 расширяет Interface2;
Тело интерфейса содержит абстрактные методы , но поскольку все методы интерфейса по определению являются абстрактными, abstract
ключевое слово не требуется. Поскольку интерфейс определяет набор доступных вариантов поведения, все методы неявно public
.
Таким образом, простой интерфейс может быть
public interface Predator { boolean chasePrey(Prey p); void eatPrey(Prey p);}
Объявления типов членов в интерфейсе неявно являются статическими, окончательными и общедоступными, но в остальном они могут быть классом или интерфейсом любого типа. [3]
Реализация интерфейсов в классе
[ редактировать ]Синтаксис реализации интерфейса использует следующую формулу:
... implements InterfaceName[, another interface, another, ...] ...
Классы могут реализовывать интерфейс. Например:
public class Lion implements Predator { @Override public boolean chasePrey(Prey p) { // Programming to chase prey p (specifically for a lion) } @Override public void eatPrey(Prey p) { // Programming to eat prey p (specifically for a lion) }}
Если класс реализует интерфейс и не реализует все его методы, он должен быть помечен как abstract
. Если класс является абстрактным, ожидается, что один из его подклассов будет реализовывать его нереализованные методы, однако, если какой-либо из подклассов абстрактного класса не реализует все методы интерфейса, сам подкласс должен быть снова помечен как abstract
.
Классы могут реализовывать несколько интерфейсов:
public class Frog implements Predator, Prey { ... }
Интерфейсы могут использовать общие методы класса:
class Animal implements LikesFood, LikesWater { boolean likes() { return true; }}
Однако данный класс не может реализовать один и тот же или похожий интерфейс несколько раз:
class Animal implements Shares<Boolean>, Shares<Integer> ...// Error: repeated interface
Интерфейсы обычно используются в языке Java для обратных вызовов , [4] поскольку Java не допускает множественного наследования классов и не позволяет передавать методы (процедуры) в качестве аргументов. Следовательно, чтобы передать метод в качестве параметра целевому методу, текущая практика заключается в том, чтобы определить и передать ссылку на интерфейс как средство предоставления сигнатуры и адреса метода параметра целевому методу, а не определять несколько вариантов. целевого метода для размещения каждого возможного вызывающего класса.
Субинтерфейсы
[ редактировать ]Интерфейсы могут расширять несколько других интерфейсов, используя ту же формулу, которая описана ниже. Например,
public interface VenomousPredator extends Predator, Venomous { // Interface body}
является законным и определяет субинтерфейс. В отличие от классов, он допускает множественное наследование. Predator
и Venomous
возможно, может определять или наследовать методы с одной и той же сигнатурой, скажем kill(Prey p)
. Когда класс реализует VenomousPredator
он будет реализовывать оба метода одновременно.
Примеры
[ редактировать ]Некоторые распространенные интерфейсы Java :
Comparable
есть методcompareTo
, который используется для описания двух объектов как равных или для обозначения того, что один из них больше другого. Обобщения позволяют реализовывать классы, чтобы указать, какие экземпляры классов можно с ними сравнивать.Serializable
— это интерфейс маркера без методов и полей — он имеет пустое тело. Он используется для указания того, что класс может быть сериализован . Его Javadoc описывает, как он должен функционировать, хотя программно ничего не применяется.
См. также
[ редактировать ]- Интерфейс (объектно-ориентированное программирование)
- смешивание
- Черта (компьютерное программирование)
Цитаты
[ редактировать ]- ^ Jump up to: а б с д Блох 2018 .
- ^ «Методы по умолчанию» . Архивировано из оригинала 23 мая 2017 г. Проверено 30 июня 2014 г.
- ^ «Спецификация языка Java» .
- ^ Митчелл, Джон Д. (1 июня 1996 г.). «Совет 10 по Java. Реализуйте процедуры обратного вызова на Java» . JavaWorld . Проверено 14 июля 2020 г.
Ссылки
[ редактировать ]- Блох, Джошуа (2018). «Эффективная Java: Руководство по языку программирования» (третье изд.). Аддисон-Уэсли. ISBN 978-0134685991 .