Інтерфейс у мові програмування Java — це абстрактний тип, який використовується для визначення поведінки, яку класи повинні реалізовувати. Інтерфейси схожі до протоколів. Інтерфейси оголошуються за допомогою ключового слова interface
, та можуть містити тільки прототипи методів і оголошення констант (або змінних, які оголошені як чи
final
). Усі методи інтерфейсу не можуть містити реалізації тіл методів в усіх версіях нижче Java 8. Починаючи з Java 8, default
та static
методи можуть мати реалізацію за замовчуванням при визначенні інтерфейсу.
Інтерфейс не може бути інстанційованим, а тільки реалізованим (тобто не можна створити об'єкт інтерфейсу з використанням оператора new). Клас, що реалізує інтерфейс, повинен визначити усі методи, описані в цьому інтерфейсі, або має бути абстрактним класом. Посилання на об'єкти в Java можуть бути позначені типом інтерфейсу; тоді у кожному такому випадку посилання може бути або null, або вказувати на об'єкт, що реалізує інтерфейс.
Однією з переваг використання інтерфейсів є те, що вони імітують множинне успадкування. Усі класи Java повинні мати тільки один базовий клас, єдиним винятком з цього правила є java.lang.Object
(верхній тип системи типів Java), оскільки множинне успадкування класів не допускається. Однак, інтерфейс може успадковувати декілька інтерфейсів, так як і клас може реалізовувати декілька інтерфейсів.
Огляд
Інтерфейси використовуються для описання подібності, яку поділяють різні класи, але які не обов'язково мають класові взаємозв'язки. Наприклад, людина і папуга обидва можуть свистіти; однак, не має сенсу представляти Human
і Parrot
класи як підкласи Whistler
. Швидше за все, вони будуть підкласами класу Animal
(ймовірно, з проміжними класами), але обидва будуть реалізовувати інтерфейс Whistler
.
Інше використання інтерфейсів — можливість використовувати об'єкт, фактично без наявності інформації про його тип, але про який відомо, що він реалізує певний інтерфейс. Виклик whistler.whistle()
буде викликати реалізацію whistle
метода об'єкта whistler
незалежно від того, який конкретний тип має цей об'єкт, але тільки за умови, що він реалізує Whistler
. Одним з практичних прикладів є алгоритм сортування, який на вхід очікує об'єкти типу Comparable
. Таким чином, без знання конкретного типу, узагальнений код знає, що об'єкти таких типів можна якимось чином порівняти, отже, і відсортувати.
Наприклад:
interface Bounceable { double pi=3.1415; void setBounce(); // Методи інтерфейсів публічні, абстрактні і ніколи не бувають незмінними (final). // Думайте про них тільки як про прототипи; їх реалізація не дозволена. }
Інтерфейс:
- оголошує тільки прототипи методів і публічні константи;
- не може бути інстанційовано;
- може бути реалізований класом;
- не може розширювати клас;
- може успадкувати декілька інших інтерфейсів.
Використання
Визначення інтерфейсу
Інтерфейси визначаються наступним синтаксисом (порівняйте з (визначенням класу Java)):
[видимість] interface InterfaceName [успадкуваання інших інтерфейсів] { константні оголошення абстрактні оголошення методів }
Тіло інтерфейсу містить абстрактні методи, та оскільки всі методи в інтерфейсі є, за визначенням, абстрактними, ключове слово abstract
не потрібно. Так як інтерфейс вказує на відкриту поведінку типу, всі методи неявно є public
методами. Таким чином, простий інтерфейс може бути визначений як
public interface Predator { boolean chasePrey(Prey p); void eatPrey(Prey p); }
Оголошення внутрішнього класу всередині тіла інтерфейсу неявно є static
, final
і public
.
Реалізація інтерфейсів в класі
Синтаксис реалізації інтерфейсу використовує наступне визначення:
... implements InterfaceName[, інший інтерфейс, ще один, ...] ...
Наприклад,
public class Lion implements Predator { @Override public boolean chasePrey(Prey p) { // програма переслідування здобичі (спеціалізація левів). } @Override public void eatPrey(Prey p) { // програма поїдання здобичі (спеціалізація левів) } }
Якщо клас реалізує інтерфейс, але не реалізує всі його методи, він повинен бути позначений як abstract
. Якщо клас є абстрактним, очікується, що один з його підкласів реалізує ці нереалізовані методи, або, якщо будь-який з підкласів абстрактного класу не реалізує всі методи інтерфейсу, цей підклас повинен бути знову позначений міткою abstract
. Класи можуть реалізовувати кілька інтерфейсів:
public class Frog implements Predator, Prey { ... }
Інтерфейси можуть мати спільні методи класу:
class Animal implements LikesFood, LikesWater { boolean likes() {return true;} }
Однак даний клас не може реалізовувати той самий або аналогічний інтерфейс декілька разів:
class Animal implements Shares<Boolean>, Shares<Integer> ... // помилка: повторення інтерфейсу
Інтерфейси зазвичай використовуються в мові Java для функцій зворотного виклику (callback), оскільки Java не дозволяє багаторазове успадкування класів, і не дозволяє передавати методи (процедури) як аргументи функцій. Тому для того, щоб передати деяку дію як параметр цільовому методу, поточний підхід полягає у створенні класу, що реалізує потрібний інтерфейс, та передачі посилання на нього у цільовий метод. Цей підхід базується на так званій таблиці віртуальних методів, що супроводжує кожен об'єкт, та яка допомагає викликати метод потрібного інтерфейсу об'єкта без фактичного знання його типу.
Надінтерфейси
Інтерфейси можуть розширювати декілька інших інтерфейсів, використовуючи наступний синтаксис:
public interface VenomousPredator extends Predator, Venomous { //interface body }
що є дозволеним і визначає надінтерфейс. Зверніть увагу на те, що багаторазове успадкування дозволене, на відміну від класів. Також зауважте, що Predator
і Venomous
можуть визначати або успадкувати методи з однаковими параметрами та порядком типів, скажімо kill(Prey p)
. Коли клас реалізує VenomousPredator
він реалізує обидва методи одночасно.
Приклади
Деякі інтерфейси стандартної бібліотеки Java:
Comparable
має методcompareTo
, який використовується для опису двох об'єктів як рівних, або для позначення одного більше, ніж для іншого. Узагальнене програмування дозволяє створювати класи, щоб вказати, які екземпляри класу можна порівняти з ними.Serializable
— це інтерфейс-маркер без методів або полів — він має порожнє тіло. Цей інтерфейс використовується для позначення класів, які можна серіалізувати. Його Javadoc сторінка описує, як він повинен функціювати, хоча програмно нічого не нав'язується.
Див. також
- Mixin
- [en]
Примітки
- . Архів оригіналу за 23 травня 2017. Процитовано 22 квітня 2019.
- . Архів оригіналу за 29 лютого 2012. Процитовано 22 квітня 2019.
- . Архів оригіналу за 16 вересня 2008. Процитовано 22 квітня 2019.
Посилання
- What Is an Interface? [ 7 липня 2009 у Wayback Machine.](англ.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Interfejs u movi programuvannya Java ce abstraktnij tip yakij vikoristovuyetsya dlya viznachennya povedinki yaku klasi povinni realizovuvati Interfejsi shozhi do protokoliv Interfejsi ogoloshuyutsya za dopomogoyu klyuchovogo slova interface ta mozhut mistiti tilki prototipi metodiv i ogoloshennya konstant abo zminnih yaki ogolosheni yak chi a href wiki Final Java title Final Java final a Usi metodi interfejsu ne mozhut mistiti realizaciyi til metodiv v usih versiyah nizhche Java 8 Pochinayuchi z Java 8 default ta static metodi mozhut mati realizaciyu za zamovchuvannyam pri viznachenni interfejsu Interfejs ne mozhe buti instancijovanim a tilki realizovanim tobto ne mozhna stvoriti ob yekt interfejsu z vikoristannyam operatora new Klas sho realizuye interfejs povinen viznachiti usi metodi opisani v comu interfejsi abo maye buti abstraktnim klasom Posilannya na ob yekti v Java mozhut buti poznacheni tipom interfejsu todi u kozhnomu takomu vipadku posilannya mozhe buti abo null abo vkazuvati na ob yekt sho realizuye interfejs Odniyeyu z perevag vikoristannya interfejsiv ye te sho voni imituyut mnozhinne uspadkuvannya Usi klasi Java povinni mati tilki odin bazovij klas yedinim vinyatkom z cogo pravila ye java lang Object verhnij tip sistemi tipiv Java oskilki mnozhinne uspadkuvannya klasiv ne dopuskayetsya Odnak interfejs mozhe uspadkovuvati dekilka interfejsiv tak yak i klas mozhe realizovuvati dekilka interfejsiv OglyadInterfejsi vikoristovuyutsya dlya opisannya podibnosti yaku podilyayut rizni klasi ale yaki ne obov yazkovo mayut klasovi vzayemozv yazki Napriklad lyudina i papuga obidva mozhut svistiti odnak ne maye sensu predstavlyati Human i Parrot klasi yak pidklasi Whistler Shvidshe za vse voni budut pidklasami klasu Animal jmovirno z promizhnimi klasami ale obidva budut realizovuvati interfejs Whistler Inshe vikoristannya interfejsiv mozhlivist vikoristovuvati ob yekt faktichno bez nayavnosti informaciyi pro jogo tip ale pro yakij vidomo sho vin realizuye pevnij interfejs Viklik whistler whistle bude viklikati realizaciyu whistle metoda ob yekta whistler nezalezhno vid togo yakij konkretnij tip maye cej ob yekt ale tilki za umovi sho vin realizuye Whistler Odnim z praktichnih prikladiv ye algoritm sortuvannya yakij na vhid ochikuye ob yekti tipu a rel nofollow class external text href https docs oracle com javase 10 docs api java lang Comparable html Comparable a Takim chinom bez znannya konkretnogo tipu uzagalnenij kod znaye sho ob yekti takih tipiv mozhna yakimos chinom porivnyati otzhe i vidsortuvati Napriklad interface Bounceable double pi 3 1415 void setBounce Metodi interfejsiv publichni abstraktni i nikoli ne buvayut nezminnimi final Dumajte pro nih tilki yak pro prototipi yih realizaciya ne dozvolena Interfejs ogoloshuye tilki prototipi metodiv i publichni konstanti ne mozhe buti instancijovano mozhe buti realizovanij klasom ne mozhe rozshiryuvati klas mozhe uspadkuvati dekilka inshih interfejsiv VikoristannyaViznachennya interfejsu Interfejsi viznachayutsya nastupnim sintaksisom porivnyajte z viznachennyam klasu Java vidimist interface InterfaceName uspadkuvaannya inshih interfejsiv konstantni ogoloshennya abstraktni ogoloshennya metodiv Tilo interfejsu mistit abstraktni metodi ta oskilki vsi metodi v interfejsi ye za viznachennyam abstraktnimi klyuchove slovo abstract ne potribno Tak yak interfejs vkazuye na vidkritu povedinku tipu vsi metodi neyavno ye public metodami Takim chinom prostij interfejs mozhe buti viznachenij yakpublic interface Predator boolean chasePrey Prey p void eatPrey Prey p Ogoloshennya vnutrishnogo klasu vseredini tila interfejsu neyavno ye static final i public Realizaciya interfejsiv v klasi Sintaksis realizaciyi interfejsu vikoristovuye nastupne viznachennya implements InterfaceName inshij interfejs she odin Napriklad public class Lion implements Predator Override public boolean chasePrey Prey p programa peresliduvannya zdobichi specializaciya leviv Override public void eatPrey Prey p programa poyidannya zdobichi specializaciya leviv Yaksho klas realizuye interfejs ale ne realizuye vsi jogo metodi vin povinen buti poznachenij yak abstract Yaksho klas ye abstraktnim ochikuyetsya sho odin z jogo pidklasiv realizuye ci nerealizovani metodi abo yaksho bud yakij z pidklasiv abstraktnogo klasu ne realizuye vsi metodi interfejsu cej pidklas povinen buti znovu poznachenij mitkoyu abstract Klasi mozhut realizovuvati kilka interfejsiv public class Frog implements Predator Prey Interfejsi mozhut mati spilni metodi klasu class Animal implements LikesFood LikesWater boolean likes return true Odnak danij klas ne mozhe realizovuvati toj samij abo analogichnij interfejs dekilka raziv class Animal implements Shares lt Boolean gt Shares lt Integer gt pomilka povtorennya interfejsu Interfejsi zazvichaj vikoristovuyutsya v movi Java dlya funkcij zvorotnogo vikliku callback oskilki Java ne dozvolyaye bagatorazove uspadkuvannya klasiv i ne dozvolyaye peredavati metodi proceduri yak argumenti funkcij Tomu dlya togo shob peredati deyaku diyu yak parametr cilovomu metodu potochnij pidhid polyagaye u stvorenni klasu sho realizuye potribnij interfejs ta peredachi posilannya na nogo u cilovij metod Cej pidhid bazuyetsya na tak zvanij tablici virtualnih metodiv sho suprovodzhuye kozhen ob yekt ta yaka dopomagaye viklikati metod potribnogo interfejsu ob yekta bez faktichnogo znannya jogo tipu Nadinterfejsi Interfejsi mozhut rozshiryuvati dekilka inshih interfejsiv vikoristovuyuchi nastupnij sintaksis public interface VenomousPredator extends Predator Venomous interface body sho ye dozvolenim i viznachaye nadinterfejs Zvernit uvagu na te sho bagatorazove uspadkuvannya dozvolene na vidminu vid klasiv Takozh zauvazhte sho Predator i Venomous mozhut viznachati abo uspadkuvati metodi z odnakovimi parametrami ta poryadkom tipiv skazhimo kill Prey p Koli klas realizuye VenomousPredator vin realizuye obidva metodi odnochasno PrikladiDeyaki interfejsi standartnoyi biblioteki Java a rel nofollow class external text href https docs oracle com javase 10 docs api java lang Comparable html Comparable a maye metod a rel nofollow class external text href https docs oracle com javase 10 docs api java lang Comparable html compareTo T compareTo a yakij vikoristovuyetsya dlya opisu dvoh ob yektiv yak rivnih abo dlya poznachennya odnogo bilshe nizh dlya inshogo Uzagalnene programuvannya dozvolyaye stvoryuvati klasi shob vkazati yaki ekzemplyari klasu mozhna porivnyati z nimi a rel nofollow class external text href https docs oracle com javase 10 docs api java io Serializable html Serializable a ce interfejs marker bez metodiv abo poliv vin maye porozhnye tilo Cej interfejs vikoristovuyetsya dlya poznachennya klasiv yaki mozhna serializuvati Jogo Javadoc storinka opisuye yak vin povinen funkciyuvati hocha programno nichogo ne nav yazuyetsya Interfejs u sestrinskih Vikiproyektah Teksti u Vikipidruchniku Div takozhMixin en Primitki Arhiv originalu za 23 travnya 2017 Procitovano 22 kvitnya 2019 Arhiv originalu za 29 lyutogo 2012 Procitovano 22 kvitnya 2019 Arhiv originalu za 16 veresnya 2008 Procitovano 22 kvitnya 2019 PosilannyaWhat Is an Interface 7 lipnya 2009 u Wayback Machine angl