interface enhancements java 8 java functional interface
Ovaj vodič objašnjava dodatke sučelju u Javi 8 i razlike između Java koncepata poput apstraktne klase, proširivanja ključne riječi itd. Sa sučeljima:
Istražili smo sve Sučelja u Javi u našem zadnjem tutorialu. Uveli smo i pokrili osnovne koncepte sučelja u Javi, uključujući višestruka sučelja.
Prije Jave 8, sučelja su smjela imati samo apstraktne metode te statičke i završne varijable. Apstraktne metode su prema zadanim postavkama javne i treba ih nadjačati klasa koja implementira sučelje.
Dakle, sučelje je uglavnom bilo ugovor i bilo je uključeno samo s konstantama (statičkim i završnim) i apstraktnim metodama.
=> Ovdje pogledajte Vodič za početnike za Java.
Što ćete naučiti:
- Promjene sučelja u Javi 8
- Java 8 funkcionalna sučelja
- Sučelje klase Vs u Javi
- Java proširuje vs implementacije
- Sučelje protiv klase sažetka u Javi
- Zaključak
Promjene sučelja u Javi 8
Izdanje Java 8 uvodi ili nam omogućuje da u sučeljima imamo statičke i zadane metode. Koristeći zadane metode u sučelju, programeri mogu sučeljima dodati više metoda. Na taj način ne ometaju i ne mijenjaju klase koje implementiraju sučelje.
Java 8 također omogućuje sučelju statičku metodu. Statičke metode su iste onima koje definiramo u nastavi. Imajte na umu da statičku metodu ne može nadjačati klasa koja implementira sučelje.
Uvođenje statičkih i zadanih metoda u sučelje olakšalo je izmjenu sučelja bez ikakvih problema, a također olakšalo implementaciju sučelja.
Java 8 također uvodi 'Lambda izraze' unutar funkcionalnih sučelja. Osim toga, od Jave 8 nadalje, u Javi je dodano više ugrađenih funkcionalnih sučelja.
U ovom uputstvu razmotrit ćemo sve ove dodatke sučeljima u Javi 8, a također ćemo razmotriti neke razlike između različitih Java koncepata poput apstraktnih klasa, ključne riječi extends itd. Sa sučeljima.
Statička metoda u sučelju na Javi
Sučelja također mogu imati metode koje mogu imati definicije. To su statičke metode u sučelju. Statičke metode definirane su unutar sučelja i ne mogu ih nadjačati ili promijeniti klase koje implementiraju ovo sučelje.
Te statičke metode možemo pozvati izravnim korištenjem imena sučelja.
Sljedeći primjer pokazuje upotrebu statičke 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 ()'); } }
Izlaz:
Gornji program ima TestInterface. Ima statičku metodu nazvanu ‘static_print’, a također i nestatičnu metodu nazvanu nonstaticmethod.
Implementirali smo TestInterface u TestClass i nadjačali nonStaticMethod. Zatim u glavnoj metodi metodu static_print pozivamo izravno pomoću TestInterface i nonStaticMethod koristeći objekt TestClass.
Zadana metoda sučelja
Kao što je već spomenuto, sučelja prije Jave 8 dopuštala su samo apstraktne metode. Tada bismo osigurali implementaciju ove metode u zasebnom razredu. Ako bismo morali dodati novu metodu na sučelje, tada bismo trebali pružiti njegov implementacijski kôd u istoj klasi.
Dakle, ako bismo promijenili sučelje dodavanjem metode, klasa implementacije također bi se promijenila.
Ovo je ograničenje prevladala verzija Java 8 koja je omogućila sučeljima zadane metode. Zadane metode na neki način pružaju povratnu kompatibilnost postojećih sučelja i ne moramo mijenjati klasu implementacije. Zadane metode poznate su i kao 'metoda virtualnog proširenja' ili 'metode branitelja'.
Zadane metode deklariraju se pomoću ključne riječi 'default' u deklaraciji. Nakon deklaracije slijedi definicija metode. Možemo nadjačati zadanu metodu jer je dostupna klasi koja implementira sučelje.
Na isti način, možemo ga pozvati koristeći objekt klase implementacije izravno sa sučelja, bez nadjačavanja.
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(); } }
Izlaz:
lažnu e-adresu koju mogu koristiti
Gornji Java program prikazuje zadanu metodu u sučelju. U glavnoj metodi imajte na umu da zadanu metodu sučelja možemo nazvati pomoću objekta klase. To je zato što je klasa implementirala sučelje, zadana metoda je dostupna i za klasu.
Bilješka: Mogli smo nadjačati metodu print () također u klasi implementacije. Imajte na umu da će se, ako se poništi, modifikator pristupa zadane metode promijeniti u javni u klasi implementacije.
Zadane metode i višestruko nasljeđivanje
Može doći do situacije u slučaju više sučelja u kojem svako sučelje može imati zadanu metodu s istim prototipom. U takvom slučaju, sastavljač ne zna koju bi metodu pozvao.
Kada se pojavi ova situacija u kojoj zadana metoda ima isti prototip u svim sučeljima, tada je rješenje nadjačati metodu u izvedbenoj klasi, tako da kad objekt izvedbene klase pozove zadanu metodu, kompajler poziva metodu implementiranu u klasi .
Sljedeći Java program prikazuje upotrebu zadane metode s više sučelja.
//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(); } }
Izlaz:
U gore navedenom programu nadjačali smo zadanu metodu (koja ima isti prototip u oba sučelja) u klasi implementacije. Na taj se način kada pozivamo zadanu metodu iz glavne metode koristeći objekt izvedbene klase, poziva se nadjačana metoda.
Java 8 funkcionalna sučelja
Funkcionalno sučelje je sučelje koje ima samo jednu apstraktnu metodu. Može sadržavati bilo koji broj zadanih i statičkih metoda, ali apstraktna metoda koju sadrži je točno jedna. Uz to, funkcionalno sučelje može imati deklaracije metoda klase objekta.
Funkcionalno sučelje poznato je pod nazivom „ Sučelje pojedinačne apstraktne metode ' ili ' SAM sučelje '. SAM sučelje je nova značajka u Javi.
U programu Java prisutnost funkcionalnog sučelja označava se pomoću a @FunctionalInterface bilješka. Kada kompajler naiđe na ovu napomenu, tada zna da je sučelje koje slijedi ovu napomenu funkcionalno. Stoga ako sadrži više od jedne apstraktne metode, tada bljeska pogreška.
Bilješka @FunctionalInterface međutim, nije obvezno na Javi.
Sljedeći program prikazuje funkcionalno sučelje na 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!!!'); } }
Izlaz:
popis programskih jezika visoke razine
Funkcionalno sučelje u gore navedenom programu ima jednu apstraktnu metodu i također ima deklaraciju metode objektne klase poput hashCode, toString i equals. U klasi koja implementira ovo sučelje, apstraktna metoda je nadjačana. U glavnoj metodi stvaramo objekt klase implementacije i koristimo je metodom.
Sučelja poput Runnable i Comparable primjeri su funkcionalnih sučelja koja se nude u Javi. Java 8 omogućuje nam dodijeljivanje lambda izraza objektu funkcionalnog sučelja.
Sljedeći primjer programa to pokazuje.
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(); } }
Izlaz:
Java 8 također nudi mnoštvo ugrađenih funkcionalnih sučelja u paketu java.util.function.
Ova ugrađena sučelja opisana su u nastavku:
# 1) Predikat
Ovo je funkcionalno sučelje u Javi koje ima jedan test apstraktne metode. Metoda ‘test’ vraća logičku vrijednost nakon testiranja navedenog argumenta.
Slijedi prototip testne metode sučelje Predikata.
public interface Predicate { public boolean test(T t); }
# 2) BinaryOperator
Sučelje BinaryOperator pruža apstraktnu metodu 'apply' koja prihvaća dva argumenta i vraća rezultantnu vrijednost istog tipa kao i argumenti.
Prototip metode accept je:
public interface BinaryOperator { public T apply (T x, T y); }
# 3) Funkcija
Funkcijsko sučelje je funkcionalno sučelje koje također ima apstraktnu metodu nazvanu 'primijeniti'. Ova metoda primjene, međutim, uzima jedan argument tipa T i vraća vrijednost tipa R.
Prototip primijenjene metode je sljedeći:
public interface Function { public R apply(T t); }
Sljedeći Java program pokazuje gornji ugrađeni predikat funkcionalnog sučelja.
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); } } }
Izlaz:
Kao što možemo vidjeti u gornjem programu, imamo popis nizova. Korištenjem funkcionalnog sučelja Predikat testiramo započinje li stavka u nizu s M, a ako počinje, ispisuje ime.
Sučelje klase Vs u Javi
Iako su klasa i sučelje slični jer imaju sličnu sintaksu, ova dva entiteta imaju više razlika nego sličnosti.
Nabrojimo neke razlike između klase i sučelja u Javi.
Razred | Sučelje |
---|---|
Možemo instancirati i stvoriti objekte iz klase. | Sučelje se ne može instancirati. |
Ključna riječ 'klasa' koristi se za stvaranje klase. | Sučelje se kreira pomoću ključne riječi 'sučelje'. |
Predavanja ne podržavaju višestruko nasljeđivanje u Javi. | Sučelja podržavaju višestruko nasljeđivanje u Javi. |
Klasa sadrži konstruktore. | Sučelja ne sadrže konstruktore. |
Predmet ne može sadržavati apstraktne metode. | Sučelja sadrže samo apstraktne metode. |
Klasa može imati varijable i metode koje su zadane, javne, privatne ili zaštićene. | Sučelje prema zadanim postavkama ima samo javne varijable i metode. |
Nije obvezno pridruživanje nepristupačnih modifikatora varijablama klase. | Sučelja mogu imati statičke ili konačne varijable. |
Možemo naslijediti drugu klasu iz klase. | Ne možemo naslijediti klasu sa sučelja. |
Klasa se može naslijediti pomoću ključne riječi ‘extends’. | Sučelje može implementirati druga klasa pomoću ključne riječi ‘implements’. Može ga naslijediti drugo sučelje pomoću ključne riječi ‘extends’. |
Java proširuje vs implementacije
'Produžuje' | 'Provodi' |
---|---|
Sučelja podržavaju samo statičke i konačne modifikatore nepristupa. | Sažetak podržava sve modifikatore koji nemaju pristup, poput statičkih, konačnih, nestatičnih i ne-konačnih. |
Klasa koristi ključnu riječ ‘extends’ za nasljeđivanje iz druge klase. | Ključnu riječ ‘implements’ koristi klasa za implementaciju sučelja. |
Klasa koja nasljeđuje drugu klasu može ili ne mora nadjačati sve metode roditeljske klase. | Klasa koja implementira sučelje mora nadjačati sve apstraktne metode sučelja. |
Pomoću ključne riječi extends možemo istodobno proširiti samo jedan razred. | Pomoću ključne riječi ‘implements’ možemo implementirati više sučelja. |
Sučelje može proširiti drugo sučelje pomoću ključne riječi 'extends'. | Sučelje ne može implementirati drugo sučelje pomoću ključnih riječi 'implementira'. |
Može li apstraktna klasa implementirati sučelje u Javi
Da, apstraktna klasa može implementirati sučelje pomoću ključne riječi ‘implements’. Apstraktna klasa ne mora implementirati sve apstraktne metode sučelja. Ali u cjelini dobra je praksa dizajna imati sučelje sa svim apstraktnim metodama, zatim apstraktnu klasu koja implementira ovo sučelje, a zatim konkretne klase.
Dolje je dat primjer takve implementacije u Javi.
Ovdje je java.util.List sučelje. Ovo sučelje implementira java.util.AbstractList. Tada se ova klasa AbstractList proširuje s dvije konkretne klase, tj. LinkedList i ArrayList.
Da su klase LinkedList i ArrayList izravno implementirali sučelje Lista, tada bi morali implementirati sve apstraktne metode sučelja Lista.
Ali u ovom slučaju, klasa AbstractList implementira metode sučelja Lista i prosljeđuje ih LinkedListu i ArrayListu. Dakle, ovdje imamo prednost deklariranja tipa iz sučelja i apstraktne fleksibilnosti klase u primjeni uobičajenog ponašanja.
Kada koristiti apstraktnu klasu i sučelje u Javi
Uglavnom koristimo apstraktnu klasu da definiramo zadano ili uobičajeno ponašanje podređenih klasa koje će se proširiti od ove apstraktne klase. Sučelje se koristi za definiranje ugovora između dvaju sustava koji djeluju u aplikaciji.
Određene specifične situacije idealne su za upotrebu sučelja i određene probleme koji se mogu riješiti samo pomoću apstraktnih klasa. U ovom ćemo odjeljku razgovarati o tome kada možemo koristiti sučelje i kada možemo koristiti apstraktne klase.
Kada koristiti sučelje:
- Sučelja se uglavnom koriste kada imamo malu sažetu funkcionalnost za implementaciju.
- Kada implementiramo API-je i znamo da se oni neko vrijeme neće promijeniti, tada idemo na sučelja.
- Sučelja nam omogućuju implementaciju višestrukog nasljeđivanja. Stoga kada u svojoj aplikaciji trebamo implementirati višestruko nasljeđivanje, idemo na sučelja.
- Kad imamo širok raspon objekata, opet su sučelja bolji izbor.
- Također kada moramo pružiti zajedničku funkcionalnost mnogim nepovezanim klasama, još uvijek se koriste sučelja.
Kada koristiti sažetak:
- Apstraktne klase uglavnom se koriste kada u svojoj aplikaciji trebamo koristiti nasljeđivanje.
- Kako se sučelja bave javnim metodama i varijablama, kad god želimo koristiti nejavne modifikatore pristupa u našem programu, koristimo apstraktne klase.
- Ako treba dodati nove metode, bolje je to raditi u apstraktnoj klasi nego u sučelju. Jer ako u sučelje dodamo novu metodu, cjelokupna implementacija se mijenja jer sučelja imaju samo prototipove metoda, a implementacija klase pomoću sučelja pružit će implementaciju.
- Ako želimo da se razvijaju različite verzije komponenata, idemo na apstraktnu nastavu. Apstraktne klase možemo lakše mijenjati. Ali sučelja se ne mogu mijenjati. Ako želimo novu verziju, moramo ponovno napisati cijelo sučelje.
- Kada želimo pružiti zajedničku implementaciju za sve komponente, tada je sažetak klasa najbolji izbor.
Sučelje protiv klase sažetka u Javi
Slijede neke od razlika između klasa Interfaces i Abstract u Javi.
Sučelje | Sažetak klase |
---|---|
Sučelje se deklarira pomoću ključne riječi 'sučelje'. | Apstraktna klasa deklarira se pomoću ključne riječi ‘abstract’. |
Sučelje se može implementirati pomoću ključne riječi ‘implements’. | Sažetak se može naslijediti pomoću ključne riječi 'extends'. |
Sučelje ne može proširiti klasu ili implementirati sučelje, može proširiti samo drugo sučelje. | Apstraktna klasa može proširiti klasu ili implementirati više sučelja. |
Članovi sučelja mogu biti samo javni. | Članovi sažetih predmeta mogu biti javni, privatni ili zaštićeni. |
Sučelje se ne može koristiti za pružanje implementacije. Može se koristiti samo kao izjava. | Za implementaciju sučelja može se koristiti apstraktna klasa. |
Višestruko nasljeđivanje može se postići pomoću sučelja. | Apstraktna klasa ne podržava višestruko nasljeđivanje. |
Sučelja mogu imati samo apstraktne metode. Iz Jave 8 može imati statičke i zadane metode. | Apstraktna klasa može imati apstraktnu ili apstraktnu metodu. |
Nasljeđivanje Enuma u Javi
Razgovarali smo o tipovima podataka enum u našoj raspravi o vrstama podataka u Javi. Svi se nabrojevi protežu od klase java.lang.Enum. Ova je klasa java.lang.Enum apstraktna klasa.
Također, sve klase nabrajanja u Javi su prema zadanim postavkama 'konačne'. Stoga, pokušaj nasljeđivanja klase iz bilo koje klase enum rezultira pogreškom kompajlera.
Kako Java ne dopušta višestruko nasljeđivanje, ne možemo naslijediti enum klasu ni od jedne druge klase jer enum klasa već nasljeđuje od java.lang.Enum. Međutim, enum klase mogu implementirati sučelja u Javi, a to se naziva nasljeđivanje Enum u Javi.
Dolje je dat primjer nasljeđivanja Enuma u 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 } }
Izlaz:
Ovdje imamo sučelje WeekDays s prototipom apstraktne metode displaydays (). Zatim definiramo enum klasu Days koja implementira WeekDays sučelje. Ovdje definiramo vrijednosti nabrajanja od NEDJELJE do SUBOTE i također nadjačavamo metodu prikaza dana.
Napokon, u glavnoj metodi pristupamo vrijednosti nabrajanja i prikazujemo je.
Često postavljana pitanja
P # 1) Što se događa ako na sučelju date tijelo metode?
Odgovor: Za verzije Jave prije Jave 8, tijelo metode nije dopušteno u sučelju. Ali budući da Java 8, možemo definirati zadane ili statičke metode unutar sučelja.
P # 2) Može li sučelje imati varijable u Javi 8?
Odgovor: U Java 8 možemo imati konstantne varijable pomoću statičkih i konačnih modifikatora. Ali u Java sučeljima ne možemo imati varijable instance. Svaki pokušaj deklariranja varijabli instance u sučelju rezultirat će pogreškom kompajlera.
P # 3) Koja su poboljšanja u sučeljima u Javi 8?
Odgovor: Najvažnije poboljšanje za sučelja u Javi 8 je da su statičke i zadane metode dopuštene u sučeljima. Možemo imati metode deklarirane kao statične ili zadane i definirati ih unutar sučelja.
P # 4) Možemo li nadjačati zadani način u Java sučelju?
Odgovor: Ne. Nije obavezno nadjačati zadani način u sučelju. To je zato što kada implementiramo sučelje u klasu, tada je zadana metoda klase dostupna klasi implementacije. Stoga, koristeći objekt klase implementacije, možemo pristupiti zadanoj metodi sučelja.
P # 5) Mogu li sučelja imati polja u Javi?
najbolji anti spyware za Windows 10
Odgovor: Da, u sučeljima na Javi možemo imati polja ili varijable, ali po defaultu su sva ta polja statična, konačna i javna.
Zaključak
U ovom uputstvu raspravljali smo o promjenama napravljenim na sučeljima u Javi 8. Java 8 je uvela statičke i zadane metode u sučeljima. Ranije smo u sučelju mogli imati samo apstraktne metode. Ali od Jave 8 nadalje možemo definirati zadane i statičke metode u Javi.
Također, Java 8 omogućuje upotrebu lambda izraza s funkcionalnim sučeljima u Javi. Tada smo također razgovarali o apstraktnim klasama i sučeljima i vidjeli kada koristiti svaku od njih u Javi. Također smo vidjeli nasljeđivanje enuma u Javi.
Također smo razgovarali o nekim razlikama između proširenja i implementacija, klase i sučelja, apstraktne klase i sučelja itd.
=> Ovdje provjerite SVE Java tutorijale.
Preporučena literatura
- Java sučelje i udžbenik sažetka klase s primjerima
- Usporediva i usporedbena sučelja u Javi
- ListIterator sučelje u Javi s primjerima
- Postavljanje sučelja u Javi: Vodič za postavljanje Java s primjerima
- Marker sučelje u Javi: serializira se i može se klonirati
- Duljina Java niza () Metoda s primjerima
- Implementacija Jave: Izrada i izvršavanje Java JAR datoteke
- Kako koristiti Java toString metodu?