Rozhraní (Java) - Interface (Java)

An rozhraní v Programovací jazyk Java je abstraktní typ který se používá k určení chování, které třídy musí implementovat. Jsou podobné protokoly. Rozhraní jsou deklarována pomocí rozhraní klíčové slovo, a může obsahovat pouze podpis metody a konstantní deklarace (deklarace proměnných, které jsou deklarovány jako obě statický a finále). Všechny metody rozhraní neobsahují implementaci (těla metod) od všech verzí pod Java 8. Počínaje Java 8, výchozí a statický metody mohou mít implementaci v rozhraní definice.[1] Pak v Javě 9 soukromé a soukromá statická byly přidány metody. V současné době může mít rozhraní Java až šest různých typů.

Rozhraní nemohou být instance, ale spíše jsou implementovány. Třída, která implementuje rozhraní, musí implementovat všechny jiné než výchozí metody popsané v rozhraní, nebo musí být abstraktní třída. Lze uvést, že odkazy na objekty v Javě jsou typu rozhraní; v každém případě musí být nula, nebo být vázán na objekt, který implementuje rozhraní.

Jednou z výhod používání rozhraní je, že simulují vícenásobné dědictví. Všechny třídy v Javě musí mít přesně jednu základní třída jedinou výjimkou je java.lang.Object (dále jen kořenová třída Java typový systém ); vícenásobné dědictví tříd není povoleno. Rozhraní však může zdědit více rozhraní a třída může implementovat více rozhraní.

Přehled

Rozhraní se používají k zakódování podobností, které třídy různých typů sdílejí, ale nemusí nutně představovat vztah třídy. Například a člověk a a Papoušek mohou oba pískat; nemělo by však smysl zastupovat Člověks a Papoušeks jako podtřídy a Whistler třída. Spíše by s největší pravděpodobností šlo o podtřídy Zvíře třída (pravděpodobně se střední třídou), ale oba by implementovali Whistler rozhraní.

Dalším využitím rozhraní je možnost používat objekt aniž by znal svůj typ třídy, ale spíše pouze to, že implementuje určité rozhraní. Pokud by například člověka otravoval hvízdavý zvuk, člověk by možná nevěděl, zda jde o člověka nebo o papouška, protože bylo možné určit pouze to, že hvízdající hvízdá. Volání píšťalka. píšťalka () zavolá implementovanou metodu pískat objektu píšťalka bez ohledu na to, jakou třídu má, pokud ji implementuje Whistler. V praktičtějším příkladu a třídicí algoritmus může očekávat objekt typu Srovnatelný. Takže bez znalosti konkrétního typu ví, že objekty tohoto typu lze nějak třídit.

Například:

rozhraní Odrazitelné {    dvojnásobek pi = 3.1415;    prázdnota setBounce();  // Všimněte si středníku                       // Metody rozhraní jsou veřejné, abstraktní a nikdy konečné.                       // Považujte je pouze za prototypy; nejsou povoleny žádné implementace.}

Rozhraní:

  • deklaruje pouze hlavičky metod a veřejné konstanty.
  • nelze vytvořit instanci.
  • lze implementovat třídou.
  • nemůže rozšířit třídu.
  • může rozšířit několik dalších rozhraní.

Používání

Definování rozhraní

Rozhraní jsou definována s následující syntaxí (v porovnání s Definice třídy Java ):

[viditelnost] rozhraní Název rozhraní [rozšiřuje další rozhraní] {        konstantní deklarace        deklarace abstraktních metod}

Příklad: veřejné rozhraní Interface1 rozšiřuje Interface2;

Tělo rozhraní obsahuje abstraktní metody, ale protože všechny metody v rozhraní jsou, podle definice, abstraktní, abstraktní klíčové slovo není povinné. Protože rozhraní určuje sadu exponovaných chování, jsou všechny metody implicitně veřejnost.

Může tedy existovat jednoduché rozhraní

veřejnost rozhraní Dravec {    booleovský chasePrey(Kořist p);    prázdnota jíst(Kořist p);}

Deklarace typu člena v rozhraní jsou implicitně statické, konečné a veřejné, ale jinak to může být jakýkoli typ třídy nebo rozhraní.[2]

Implementace rozhraní ve třídě

Syntaxe pro implementaci rozhraní používá tento vzorec:

... nářadí Název rozhraní[, jiné rozhraní, další, ...] ...

Třídy může implementovat rozhraní. Například:

veřejnost třída Lev nářadí Dravec {    @ Přepis    veřejnost booleovský chasePrey(Kořist p) {           // Programování k pronásledování kořisti p (konkrétně pro lva)    }    @ Přepis    veřejnost prázdnota jíst(Kořist p) {           // Programování k jídlu kořisti p (konkrétně pro lva)    }}

Pokud třída implementuje rozhraní a neimplementuje všechny své metody, musí být označena jako abstraktní. Pokud je třída abstraktní, jedna z jejích podtřídy se očekává, že bude implementovat své neimplementované metody, i když pokud některá z podtříd abstraktní třídy neimplementuje všechny metody rozhraní, musí být podtřída sama znovu označena jako abstraktní.

Třídy mohou implementovat více rozhraní:

veřejnost třída Žába nářadí Dravec, Kořist { ... }

Rozhraní mohou sdílet běžné metody tříd:

třída Zvíře nářadí Má rád jídlo, Má rád vodu {    booleovský má rád() { vrátit se skutečný; }}

Daná třída však nemůže implementovat stejné nebo podobné rozhraní vícekrát:

třída Zvíře nářadí Akcie<Booleovský>, Akcie<Celé číslo> ...// Chyba: opakované rozhraní

Rozhraní se běžně používají v jazyce Java pro zpětná volání,[3] protože Java neumožňuje vícenásobné dědění tříd ani neumožňuje předávání metod (procedur) jako argumentů. Proto, aby bylo možné předat metodu jako parametr cílové metodě, je běžnou praxí definovat a předat odkaz na rozhraní jako prostředek k dodání podpisu a adresy parametrické metody cílové metodě namísto definování více variant cílové metody pro přizpůsobení každé možné volající třídě.

Podrozhraní

Rozhraní mohou rozšířit několik dalších rozhraní pomocí stejného vzorce, jak je popsáno níže. Například,

veřejnost rozhraní VenomousPredator rozšiřuje Dravec, Jedovatý {    // Tělo rozhraní}

je legální a definuje podrozhraní. Na rozdíl od tříd umožňuje vícenásobné dědictví. Dravec a Jedovatý může případně definovat nebo zdědit metody se stejným podpisem, řekněme zabít (kořist p). Když třída implementuje VenomousPredator bude implementovat obě metody současně.

Příklady

Některé běžné Jáva rozhraní jsou:

  • Srovnatelný má metodu porovnat s, který se používá k popisu dvou objektů jako rovnocenných nebo k označení jednoho je větší než druhého. Generika umožnit implementujícím třídám určit, které instance tříd lze s nimi porovnávat.
  • Serializovatelné je značkovací rozhraní bez metod nebo polí - má prázdné tělo. Používá se k označení, že třída může být serializováno. Své Javadoc popisuje, jak by to mělo fungovat, i když nic není programově vynucováno

Viz také

Reference

  1. ^ „Výchozí metody“. Archivovány od originál dne 2017-05-23. Citováno 2014-06-30.
  2. ^ "Specifikace jazyka Java".
  3. ^ Mitchell, John D. (1. června 1996). „Java Tip 10: Implementujte rutiny zpětného volání v Javě“. JavaWorld. Citováno 2020-07-14.

externí odkazy