Интерфейс (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 .