interface enhancements java 8 java functional interface
Ta vadnica razlaga dodatke vmesnika v Javi 8 in razlike med koncepti Java, kot so abstraktni razred, razširja ključno besedo itd. Z vmesniki:
Vse smo raziskali Vmesniki v Javi v naši zadnji vadnici. Predstavili smo in zajeli osnovne koncepte vmesnikov v Javi, vključno z več vmesniki.
Pred Java 8 so vmesniki smeli imeti samo abstraktne metode ter statične in končne spremenljivke. Abstraktne metode so privzeto javne in jih mora preglasiti razred, ki izvaja vmesnik.
Vmesnik je bil torej v glavnem pogodba in je bil povezan samo s konstantami (statičnimi in končnimi) in abstraktnimi metodami.
=> Tukaj si oglejte Vodnik za začetnike Java.
Kaj se boste naučili:
- Spremembe vmesnikov v Javi 8
- Funkcionalni vmesniki Java 8
- Razred Vs vmesnik v Javi
- Java razširja Vs implementacije
- Interface Vs Abstract Class In Java
- Zaključek
Spremembe vmesnikov v Javi 8
Izdaja Java 8 uvaja ali nam omogoča statične in privzete metode v vmesnikih. Z uporabo privzetih metod v vmesniku lahko razvijalci vmesnikom dodajo več metod. Tako ne motijo ali spreminjajo razredov, ki izvajajo vmesnik.
Java 8 omogoča tudi vmesniku statično metodo. Statične metode so enake tistim, ki jih definiramo v razredih. Upoštevajte, da razreda, ki izvaja vmesnik, statične metode ne more preglasiti.
Uvedba statičnih in privzetih metod v vmesnik je olajšala spreminjanje vmesnikov brez težav in tudi lažjo izvedbo vmesnikov.
Java 8 v funkcionalne vmesnike uvaja tudi 'Lambda izraze'. Poleg tega je od Jave 8 naprej v Javo dodanih več vgrajenih funkcionalnih vmesnikov.
V tej vadnici bomo razpravljali o vseh teh dodatkih vmesnikov v Javi 8 in tudi o nekaterih razlikah med različnimi koncepti Java, kot so abstraktni razredi, ključna beseda extends itd. Z vmesniki.
Statična metoda v vmesniku v Javi
Vmesniki imajo lahko tudi metode, ki imajo lahko definicije. To so statične metode v vmesniku. Statične metode so definirane znotraj vmesnika in jih razredi, ki izvajajo ta vmesnik, ne morejo preglasiti ali spremeniti.
Te statične metode lahko pokličemo z neposredno uporabo imena vmesnika.
Naslednji primer prikazuje uporabo statične metode.
//interface declaration interface TestInterface { // static method definition static void static_print() { System.out.println('TestInterface::static_print ()'); } // abstract method declaration void nonStaticMethod(String str); } // Interface implementation class TestClass implements TestInterface { // Override interface method @Override public void nonStaticMethod(String str) { System.out.println(str); } } public class Main{ public static void main(String() args) { TestClass classDemo = new TestClass(); // Call static method from interface TestInterface.static_print(); // Call overridden method using class object classDemo.nonStaticMethod('TestClass::nonStaticMethod ()'); } }
Izhod:
Zgornji program ima TestInterface. Ima statično metodo z imenom 'static_print' in tudi nestetično metodo z imenom nonstaticmethod.
V testni razred smo uvedli testni vmesnik in preglasili nonStaticMethod. Nato v glavni metodi pokličemo metodo static_print neposredno z uporabo TestInterface in nonStaticMethod z uporabo predmeta TestClass.
Privzeta metoda vmesnika
Kot smo že omenili, so vmesniki pred Java 8 dovoljevali le abstraktne metode. Nato bi izvedli to metodo v ločenem razredu. Če bi morali vmesniku dodati novo metodo, moramo v istem razredu navesti njeno izvedbeno kodo.
Če bi torej vmesnik spremenili z dodajanjem metode, bi se spremenil tudi razred izvedbe.
To omejitev je premagala različica Java 8, ki je vmesnikom omogočala privzete metode. Privzete metode na nek način omogočajo povratno združljivost obstoječih vmesnikov in nam ni treba spreminjati izvedbenega razreda. Privzete metode so znane tudi kot 'metoda navidezne razširitve' ali 'metode zagovornika'.
Privzete metode so deklarirane z uporabo ključne besede 'default' v deklaraciji. Izjavi sledi opredelitev metode. Privzeto metodo lahko preglasimo, saj je na voljo razredu, ki izvaja vmesnik.
Na enak način ga lahko prikličemo z uporabo predmeta razreda izvedbe neposredno iz vmesnika, ne da bi ga preglasili.
interface TestInterface { // abstract method public void cubeNumber(int num); // default method default void print() { System.out.println('TestInterface :: Default method'); } } class TestClass implements TestInterface { // override cubeNumber method public void cubeNumber(int num) { System.out.println('Cube of given number ' + num+ ':' + num*num*num); } } class Main{ public static void main(String args()) { TestClass obj = new TestClass(); obj.cubeNumber(5); // call default method print using class object obj.print(); } }
Izhod:
najboljša vohunska programska oprema na daljavo za mobilne telefone
Zgornji program Java prikazuje privzeto metodo v vmesniku. Pri glavni metodi upoštevajte, da lahko privzeto metodo vmesnika pokličemo s pomočjo predmeta razreda. Ker razred izvaja vmesnik, je privzeta metoda na voljo tudi za razred.
Opomba: Metodo print () bi lahko preglasili tudi v izvedbenem razredu. Upoštevajte, da se bo modifikator dostopa privzete metode v primeru razveljavitve spremenil v javni v izvedbenem razredu.
Privzete metode in večkratno dedovanje
V primeru več vmesnikov lahko pride do situacije, pri kateri ima vsak vmesnik privzeto metodo z istim prototipom. V takem primeru prevajalnik ne ve, katero metodo naj uporabi.
Ko pride do te situacije, ko ima privzeta metoda enak prototip v vseh vmesnikih, je rešitev, da metodo preglasimo v izvedbenem razredu, tako da, ko objekt razreda izvedbe pokliče privzeto metodo, prevajalnik prikliče metodo, ki je bila izvedena v razredu. .
Naslednji program Java prikazuje uporabo privzete metode z več vmesniki.
//Interface_One interface Interface_One{ //defaultMethod default void defaultMethod(){ System.out.println('Interface_One::defaultMethod'); } } //Interface_Two interface Interface_Two{ //defaultMethod default void defaultMethod(){ System.out.println('Interface_Two::defaultMethod'); } } class TestExample implements Interface_One, Interface_Two{ public void disp(String str){ System.out.println('String is: '+str); } //override defaultMethod to take care of the ambiguity public void defaultMethod(){ System.out.println('TestExample::defaultMethod'); } } class Main{ public static void main(String() args) { TestExample obj = new TestExample(); //call the default method obj.defaultMethod(); } }
Izhod:
V zgornjem programu smo v izvedbenem razredu preglasili privzeto metodo (ki ima v obeh vmesnikih isti prototip). Na ta način, ko prikličemo privzeto metodo iz glavne metode z uporabo predmeta izvedbenega razreda, se prikliče nadomeščena metoda.
Funkcionalni vmesniki Java 8
Funkcionalni vmesnik je vmesnik, ki ima samo eno abstraktno metodo. Vsebuje lahko poljubno število privzetih in statičnih metod, vendar je abstraktna metoda natančno ena. Poleg tega ima lahko funkcionalni vmesnik izjave metod razredov predmetov.
Funkcionalni vmesnik je znan kot „ Enotni vmesnik abstraktne metode 'Ali' SAM vmesnik '. Vmesnik SAM je nova funkcija v Javi.
V programu Java je prisotnost funkcionalnega vmesnika označena z uporabo @FunctionalInterface pripis. Ko prevajalnik naleti na to pripis, potem ve, da je vmesnik, ki sledi temu pripisu, funkcionalen. Če torej vsebuje več kot eno abstraktno metodo, utripa napaka.
Pripis @FunctionalInterface vendar v Javi ni obvezen.
Naslednji program prikazuje funkcijski vmesnik v Javi:
//declare a functional interface @FunctionalInterface //annotation indicates it’s a functional interface interface function_Interface{ void disp_msg(String msg); // abstract method // Object class methods. int hashCode(); String toString(); boolean equals(Object obj); } //implementation of Functional Interface class FunctionalInterfaceExample implements function_Interface{ public void disp_msg(String msg){ System.out.println(msg); } } class Main{ public static void main(String() args) { //create object of implementation class and call method FunctionalInterfaceExample finte = new FunctionalInterfaceExample(); finte.disp_msg('Hello, World!!!'); } }
Izhod:
Funkcionalni vmesnik v zgornjem programu ima eno samo abstraktno metodo in ima tudi deklaracijo metode predmeta razreda, kot so hashCode, toString in equals. V razredu, ki izvaja ta vmesnik, je abstraktna metoda razveljavljena. V glavni metodi izdelamo objekt izvedbenega razreda in uporabimo metodo.
Vmesniki, kot sta Runnable in Comparable, so primeri funkcionalnih vmesnikov, ki jih ponuja Java. Java 8 nam omogoča, da funkcijskemu vmesniku dodelimo lambda izraze.
Naslednji primer programa to dokazuje.
class Main{ public static void main(String args()) { // use lambda expression to create the object new Thread(()-> {System.out.println('New thread created with functional interface');}).start(); } }
Izhod:
Java 8 ponuja tudi številne vgrajene funkcionalne vmesnike v paketu java.util.function.
Ti vgrajeni vmesniki so opisani spodaj:
# 1) Predikat
To je funkcionalni vmesnik v Javi, ki ima en sam test abstraktne metode. Metoda ‘test’ vrne logično vrednost po preizkusu navedenega argumenta.
Spodaj je prototip testne metode vmesnika Predicate.
public interface Predicate { public boolean test(T t); }
# 2) BinaryOperator
Vmesnik BinaryOperator ponuja abstraktno metodo 'apply', ki sprejme dva argumenta in vrne posledično vrednost iste vrste kot argumenti.
kako razvrstiti polja v javi -
Prototip metode accept je:
public interface BinaryOperator { public T apply (T x, T y); }
# 3) Funkcija
Funkcijski vmesnik je funkcijski vmesnik, ki ima tudi abstraktno metodo z imenom „apply“. Ta metoda uporabe pa sprejme en argument tipa T in vrne vrednost tipa R.
Prototip uporabne metode je naslednji:
public interface Function { public R apply(T t); }
Naslednji program Java prikazuje zgornji vgrajeni funkcijski vmesnik Predikat.
import java.util.*; import java.util.function.Predicate; class Main { public static void main(String args()) { // create a list of strings List names = Arrays.asList('Karen','Mia','Sydney','Lacey','Megan'); // declare string type predicate and use lambda expression to create object Predicate p = (s)->s.startsWith('M'); System.out.println('Names starting with M:'); // Iterate through the list for (String st:names) { // test each entry with predicate if (p.test(st)) System.out.println(st); } } }
Izhod:
Kot lahko vidimo v zgornjem programu, imamo seznam nizov. S funkcijskim vmesnikom Predicate preizkusimo, ali se element v nizu začne z M in če se začne, nato natisne ime.
Razred Vs vmesnik v Javi
Čeprav sta razred in vmesnik podobna, saj imata podobno skladnjo, imata ti dve entiteti več razlik kot podobnosti.
Naštejmo nekaj razlik med razredom in vmesnikom v Javi.
Razred | Vmesnik |
---|---|
Lahko ustvarimo primere in ustvarimo predmete iz razreda. | Vmesnika ni mogoče ustvariti. |
Ključna beseda 'razred' se uporablja za ustvarjanje predavanja. | Vmesnik je ustvarjen s ključno besedo 'vmesnik'. |
Razredi ne podpirajo večkratnega dedovanja v Javi. | Vmesniki podpirajo večkratno dedovanje v Javi. |
Razred vsebuje konstruktorje. | Vmesniki ne vsebujejo konstruktorjev. |
Predavanje ne sme vsebovati abstraktnih metod. | Vmesniki vsebujejo samo abstraktne metode. |
Razred ima lahko spremenljivke in metode, ki so privzete, javne, zasebne ali zaščitene. | Vmesnik ima privzeto samo javne spremenljivke in metode. |
Ni obvezno povezovati modifikatorjev dostopa s spremenljivkami razreda. | Vmesniki imajo lahko spremenljivke, ki so statične ali končne. |
Od razreda lahko podedujemo še en razred. | Iz vmesnika ne moremo podedovati razreda. |
Razred lahko podedujemo s ključno besedo 'extends'. | Vmesnik lahko implementira drug razred z uporabo ključne besede ‘implements’. Podeduje ga lahko drug vmesnik s ključno besedo 'extends'. |
Java razširja Vs implementacije
'Podaljša' | „Pripomočki“ |
---|---|
Vmesniki podpirajo samo statične in končne modifikatorje dostopa. | Povzetek podpira vse modifikatorje, ki nimajo dostopa, kot so statični, končni, nestatični in nekončni. |
Razred za podedovanje iz drugega razreda uporablja ključno besedo »extends«. | Ključno besedo ‘implements’ uporablja razred za izvedbo vmesnika. |
Razred, ki podeduje drug razred, lahko ali ne, preglasi vse metode nadrejenega razreda. | Razred, ki izvaja vmesnik, mora preglasiti vse abstraktne metode vmesnika. |
S ključno besedo extends lahko hkrati razširimo samo en razred. | Z uporabo ključne besede ‘implements’ lahko implementiramo več vmesnikov. |
Vmesnik lahko razširi drug vmesnik s ključno besedo »extends«. | Vmesnik ne more implementirati drugega vmesnika z uporabo ključnih besed »implements«. |
Zna vmesnik za izvedbo abstraktnega razreda v Javi
Da, abstraktni razred lahko implementira vmesnik z uporabo ključne besede ‘implements’. Za abstraktni razred ni treba izvajati vseh abstraktnih metod vmesnika. Toda na splošno je dobra praksa oblikovanja, če imamo vmesnik z vsemi abstraktnimi metodami, nato abstraktni razred, ki izvaja ta vmesnik, in nato konkretne razrede.
Spodaj je primer take izvedbe v Javi.
Tu je java.util.List vmesnik. Ta vmesnik izvaja java.util.AbstractList. Potem se ta razred AbstractList razširi z dvema konkretnima razredoma, tj. LinkedList in ArrayList.
Če bi razredi LinkedList in ArrayList neposredno implementirali vmesnik List, bi morali implementirati vse abstraktne metode vmesnika List.
Toda v tem primeru razred AbstractList izvaja metode vmesnika List in jih posreduje LinkedList in ArrayList. Tu imamo torej prednost deklariranja tipa iz vmesnika in abstraktne prilagodljivosti razreda pri izvajanju običajnega vedenja.
Kdaj uporabiti abstraktni razred in vmesnik v Javi
Abstraktni razred uporabljamo predvsem za definiranje privzetega ali običajnega vedenja podrejenih razredov, ki se bodo razširili od tega abstraktnega razreda. Vmesnik se uporablja za definiranje pogodbe med dvema sistemoma, ki delujeta v aplikaciji.
Določene posebne situacije so idealne za uporabo vmesnikov in določene težave, ki jih je mogoče rešiti samo z abstraktnimi razredi. V tem poglavju bomo razpravljali o tem, kdaj lahko uporabimo vmesnik in kdaj abstraktne razrede.
Kdaj uporabiti vmesnik:
- Vmesniki se uporabljajo predvsem, kadar imamo za uporabo majhno jedrnato funkcionalnost.
- Ko implementiramo API-je in vemo, da se nekaj časa ne bodo spremenili, se takrat odločimo za vmesnike.
- Vmesniki nam omogočajo izvajanje večkratnega dedovanja. Ko moramo v svoji aplikaciji uporabiti več dedovanja, se odločimo za vmesnike.
- Ko imamo široko paleto predmetov, so spet vmesniki boljša izbira.
- Tudi kadar moramo mnogim nepovezanim razredom zagotoviti skupno funkcionalnost, se še vedno uporabljajo vmesniki.
Kdaj uporabiti abstraktni razred:
- Abstraktni razredi se uporabljajo predvsem takrat, ko moramo v svoji aplikaciji uporabiti dedovanje.
- Ker se vmesniki ukvarjajo z javnimi metodami in spremenljivkami, kadar želimo v svojem programu uporabiti nejavne modifikatorje dostopa, uporabljamo abstraktne razrede.
- Če je treba dodati nove metode, je bolje, da to storite v abstraktnem razredu kot v vmesniku. Ker če v vmesnik dodamo novo metodo, se celotna izvedba spremeni, saj imajo vmesniki samo prototipe metod, izvedba razreda z uporabo vmesnika pa bo zagotovila izvedbo.
- Če želimo, da se razvijajo različne različice komponent, se odločimo za abstraktni tečaj. Abstraktne razrede lahko lažje spremenimo. Toda vmesnikov ni mogoče spremeniti. Če želimo novo različico, moramo znova napisati celoten vmesnik.
- Ko želimo zagotoviti skupno izvedbo vseh komponent, je abstraktni razred najboljša izbira.
Interface Vs Abstract Class In Java
Spodaj je nekaj razlik med razredi vmesnikov in abstraktnimi razredi v Javi.
Vmesnik | Povzetek pouka |
---|---|
Vmesnik se prijavi s ključno besedo 'vmesnik'. | Abstraktni razred je razglašen s ključno besedo 'abstract'. |
Vmesnik je mogoče implementirati s pomočjo ključne besede ‘implements’. | Izvleček lahko podedujemo s ključno besedo 'extends'. |
Vmesnik ne more razširiti razreda ali implementirati vmesnika, lahko samo razširiti drug vmesnik. | Abstraktni razred lahko razširi razred ali izvede več vmesnikov. |
Člani vmesnika so lahko samo javni. | Člani abstraktnega predavanja so lahko javni, zasebni ali zaščiteni. |
Vmesnika ni mogoče uporabiti za izvajanje. Uporablja se lahko le kot izjava. | Za izvedbo vmesnika lahko uporabimo abstraktni razred. |
Večkratno dedovanje je mogoče doseči z uporabo vmesnikov. | Razred Povzetek ne podpira večkratnega dedovanja. |
Vmesniki imajo lahko samo abstraktne metode. Iz Jave 8 ima lahko statične in privzete metode. | Abstraktni razred ima lahko abstraktno ali abstraktno metodo. |
Dedovanje Enuma v Javi
V razpravi o podatkovnih tipih v Javi smo razpravljali o vrstah podatkov enum. Vse enume segajo od razreda java.lang.Enum. Ta razred java.lang.Enum je abstraktni razred.
Prav tako so vsi razredi enum v Javi privzeto 'končni'. Zato poskus podedovanja razreda iz katerega koli razreda naštevanja povzroči napako prevajalnika.
Ker Java ne dovoljuje večkratnega dedovanja, razreda enum ne moremo podedovati iz katerega koli drugega razreda, saj enum razred že podeduje iz java.lang.Enum. Vendar lahko razredi enum implementirajo vmesnike v Javi, kar se v Javi imenuje dedovanje Enum.
Spodaj je primer Enumovskega dedovanja v Javi.
//WeekDays interface declaration interface WeekDays { public void displaydays(); } //enum class implementing WeekDays interface enum Days implements WeekDays { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY,FRIDAY, SATURDAY; public void displaydays() { //Override displaydays method System.out.println('The day of the week: ' + this); } } class Main { public static void main(String() args) { Days.MONDAY.displaydays(); //access enum value } }
Izhod:
Tu imamo vmesnik WeekDays z abstraktno metodo prototipa displaydays (). Nato definiramo enum razred Days, ki izvaja vmesnik WeekDays. Tu določimo vrednosti naštevanja od NEDELJE do SOBOTE in preglasimo tudi metodo displaydays.
Na koncu v glavni metodi dostopamo do vrednosti enum in jo prikažemo.
Pogosto zastavljena vprašanja
V # 1) Kaj se zgodi, če v vmesnik vnesete telo metode?
Odgovor: Za različice Java pred Java 8 telo metode v vmesniku ni dovoljeno. Toda od Java 8 lahko znotraj vmesnika določimo privzete ali statične metode.
V # 2) Ali lahko vmesnik vsebuje spremenljivke v Javi 8?
Odgovor: V Java 8 imamo lahko konstantne spremenljivke z uporabo statičnih in končnih modifikatorjev. Vendar v vmesnikih Java ne moremo imeti spremenljivk primerka. Vsak poskus razglasitve spremenljivk primerka v vmesniku bo povzročil napako prevajalnika.
V # 3) Kakšne so izboljšave vmesnikov v Javi 8?
Odgovor: Najpomembnejše izboljšanje vmesnikov v Javi 8 je, da so v vmesnikih dovoljene statične in privzete metode. Metode imamo lahko razglašene za statične ali privzete in jih definiramo znotraj vmesnika.
V # 4) Ali lahko v vmesniku Java preglasimo privzeto metodo?
Odgovor: Ne. V vmesniku ni treba preglasiti privzete metode. To je zato, ker ko implementiramo vmesnik v razred, je privzeta metoda razreda dostopna izvedbenemu razredu. Tako lahko z uporabo predmeta izvedbenega razreda dostopamo do privzete metode vmesnika.
V # 5) Ali lahko vmesniki vsebujejo polja v Javi?
c ++ pretvorba char v int
Odgovor: Da, v vmesnikih v Javi imamo lahko polja ali spremenljivke, vendar so vsa ta polja privzeto statična, končna in javna.
Zaključek
V tej vadnici smo razpravljali o spremembah vmesnikov v Javi 8. Java 8 je v vmesnike uvedla statične in privzete metode. Prej smo imeli v vmesniku samo abstraktne metode. Toda od Jave 8 naprej lahko v Javi definiramo privzete in statične metode.
Java 8 omogoča tudi uporabo lambda izrazov s funkcionalnimi vmesniki v Javi. Nato smo razpravljali tudi o abstraktnih razredih in vmesnikih ter videli, kdaj uporabiti vsakega od njih v Javi. V Java smo videli tudi dedovanje enum.
Razpravljali smo tudi o nekaterih razlikah med razširitvami in izvedbami, razredom in vmesnikom, abstraktnim razredom in vmesnikom itd.
=> Tukaj preverite VSE Vadnice za Java.
Priporočeno branje
- Vadnica Java vmesnika in abstraktnega razreda s primeri
- Primerljivi in primerjalni vmesniki v Javi
- ListIterator vmesnik v Javi s primeri
- Nastavitev vmesnika v Javi: Vadnica za nastavitev Java s primeri
- Označevalni vmesnik v Javi: serializiran in dostopen
- Dolžina niza Java () Metoda s primeri
- Uvajanje Java: Ustvarjanje in izvajanje datoteke Java JAR
- Kako uporabiti metodo Java toString?