interface enhancements java 8 java functional interface
Овај водич објашњава додатке интерфејсу у Јави 8 и разлике између Јава концепата попут апстрактне класе, проширивања кључне речи итд. Са интерфејсима:
Истражили смо све о томе Интерфејси у Јави у нашем последњем упутству. Увели смо и покрили основне концепте интерфејса у Јави, укључујући вишеструке интерфејсе.
Пре Јаве 8, интерфејсима је било дозвољено да имају само апстрактне методе и статичке и завршне променљиве. Апстрактне методе су подразумевано јавне и треба да их надјача класа која имплементира интерфејс.
Дакле, интерфејс је углавном био уговор и био је укључен само са константама (статичким и завршним) и апстрактним методама.
=> Овде погледајте водич за почетнике Јава.
Шта ћете научити:
- Промене интерфејса у Јави 8
- Јава 8 функционални интерфејси
- Интерфејс класе Вс у Јави
- Јава проширује Вс имплементације
- Интерфејс против апстрактне класе у Јави
- Закључак
Промене интерфејса у Јави 8
Издање Јава 8 уводи или нам омогућава да имамо статичке и подразумеване методе у интерфејсима. Користећи подразумеване методе у интерфејсу, програмери могу да додају више метода у интерфејсе. На овај начин они не ометају и не мењају класе које имплементирају интерфејс.
Јава 8 такође омогућава интерфејсу да има статички метод. Статичке методе су исте као оне које дефинишемо у настави. Имајте на уму да класу која имплементира интерфејс не може заменити статички метод.
Увођење статичких и подразумеваних метода у интерфејс олакшало је измену интерфејса без икаквих проблема и олакшало њихову примену.
Јава 8 такође уводи „Ламбда изразе“ унутар функционалних интерфејса. Поред тога, од Јаве 8 надаље је у Јаву додато више уграђених функционалних интерфејса.
У овом упутству ћемо размотрити све ове додатке интерфејсима у Јави 8, а такође ћемо размотрити и неке разлике између различитих Јава концепата попут апстрактних класа, кључне речи ектендс итд. Са интерфејсима.
Статичка метода у интерфејсу на Јави
Интерфејси такође могу имати методе које могу имати дефиниције. То су статичке методе у интерфејсу. Статичке методе су дефинисане унутар интерфејса и не могу их надјачати или променити класе које имплементирају овај интерфејс.
Ове статичке методе можемо позвати директним коришћењем имена интерфејса.
Следећи пример показује употребу статичке методе.
//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 ()'); } }
Излаз:
Горњи програм има ТестИнтерфаце. Има статичку методу названу „статиц_принт“, а такође и нестатичну методу названу нонстатицметход.
Имплементирали смо ТестИнтерфаце у ТестЦласс и надјачали нонСтатицМетход. Тада у главној методи методу статиц_принт позивамо директно користећи ТестИнтерфаце и нонСтатицМетход користећи објекат ТестЦласс.
Подразумевани метод интерфејса
Као што је већ поменуто, интерфејси пре Јава 8 дозвољавали су само апстрактне методе. Тада бисмо обезбедили примену ове методе у посебном разреду. Ако бисмо морали да додамо нови метод интерфејсу, онда морамо да наведемо његов код за примену у истој класи.
Стога, ако бисмо интерфејс променили додавањем методе, класа примене би се такође променила.
Ово ограничење је превазиђено верзијом Јава 8 која је омогућавала интерфејсима задате методе. Подразумеване методе на неки начин пружају повратну компатибилност постојећих интерфејса и не треба да мењамо класу имплементације. Подразумеване методе су такође познате као „метода виртуелног продужења“ или „методе браниоца“.
Подразумеване методе се декларишу употребом кључне речи „дефаулт“ у декларацији. Након декларације следи дефиниција методе. Можемо да заменимо подразумевани метод пошто је доступан класи која имплементира интерфејс.
На исти начин, можемо га позвати користећи објекат класе имплементације из интерфејса директно, без да га заменимо.
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(); } }
Излаз:
преузмите монгодб за Виндовс 10 64 бит
Горњи Јава програм приказује задати метод у интерфејсу. У главној методи имајте на уму да подразумевану методу интерфејса можемо назвати помоћу објекта класе. То је зато што је класа имплементирала интерфејс, подразумевани метод је доступан и за класу.
Белешка: Могли смо да заменимо методу принт () и у класи имплементације. Имајте на уму да ће се, ако се поништи, модификатор приступа подразумеване методе променити у јавни у класи имплементације.
Подразумеване методе и вишеструко наслеђивање
Може доћи до ситуације у случају више интерфејса у којима сваки интерфејс може имати подразумевану методу са истим прототипом. У таквом случају, компајлер не зна на коју методу да се позове.
Када се појави ова ситуација у којој подразумевана метода има исти прототип у свим интерфејсима, тада је решење надјачавање методе у класи имплементације, тако да када објект класе имплементације позове подразумевану методу, преводилац позива методу имплементирану у класи .
Следећи Јава програм демонстрира употребу подразумеване методе са више интерфејса.
//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(); } }
Излаз:
У горњем програму смо заменили подразумевану методу (која има исти прототип у оба интерфејса) у класи имплементације. На овај начин када позивамо подразумевану методу из главне методе користећи објекат класе имплементације, позива се замењена метода.
Јава 8 функционални интерфејси
Функционални интерфејс је интерфејс који има само један апстрактни метод. Може садржати било који број заданих и статичких метода, али апстрактна метода коју садржи је тачно једна. Поред тога, функционални интерфејс може имати декларације метода класе објекта.
Функционални интерфејс познат је као „ Интерфејс појединачне апстрактне методе ”Или„ САМ интерфејс ”. САМ интерфејс је нова функција у Јави.
У Јава програму присуство функционалног интерфејса се означава коришћењем а @ФунцтионалИнтерфаце Анотација. Када компајлер наиђе на ову напомену, тада зна да је интерфејс који прати ову напомену функционалан. Дакле, ако садржи више од једне апстрактне методе, онда трепери грешка.
Напомена @ФунцтионалИнтерфаце међутим, није обавезно на Јави.
Следећи програм демонстрира функционални интерфејс на Јави:
//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!!!'); } }
Излаз:
Функционални интерфејс у горе наведеном програму има једну апстрактну методу и такође има декларацију методе класе објекта попут хасхЦоде, тоСтринг и екуалс. У класи која примењује овај интерфејс, апстрактна метода је замењена. У главној методи креирамо објекат класе имплементације и користимо је.
Интерфејси попут Руннабле и Цомпарабле су примери функционалних интерфејса обезбеђених у Јави. Јава 8 нам омогућава додељивање ламбда израза објекту функционалног интерфејса.
Следећи пример програма то показује.
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(); } }
Излаз:
Јава 8 такође нуди мноштво уграђених функционалних интерфејса у пакету јава.утил.фунцтион.
Ови уграђени интерфејси су описани у наставку:
# 1) Предикат
Ово је функционални интерфејс у Јави који има један тест апстрактне методе. Метода ‘тест’ враћа логичку вредност након тестирања наведеног аргумента.
Доље је дат прототип за тест методу предикатног интерфејса.
public interface Predicate { public boolean test(T t); }
# 2) БинариОператор
БинариОператор интерфејс пружа апстрактну методу „аппли“ која прихвата два аргумента и враћа резултујућу вредност истог типа као и аргументи.
Прототип методе аццепт је:
најбољи компајлери за ц ++
public interface BinaryOperator { public T apply (T x, T y); }
# 3) Функција
Функцијски интерфејс је функционални интерфејс који такође има апстрактну методу названу „применити“. Ова метода примене, међутим, узима један аргумент типа Т и враћа вредност типа Р.
Прототип методе примене је следећи:
public interface Function { public R apply(T t); }
Следећи Јава програм приказује горњи уграђени предикат функционалног интерфејса.
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); } } }
Излаз:
Као што видимо у горњем програму, имамо листу низова. Користећи функционални интерфејс Предикат, тестирамо да ли ставка у низу започиње са М, а ако јесте, онда исписује име.
Интерфејс класе Вс у Јави
Иако су класа и интерфејс слични јер имају сличну синтаксу, ова два ентитета имају више разлика него сличности.
Набројимо неке разлике између класе и интерфејса у Јави.
Класа | Интерфејс |
---|---|
Можемо инстанцирати и креирати објекте из класе. | Интерфејс се не може инстанцирати. |
Кључна реч „класа“ користи се за стварање класе. | Интерфејс се креира помоћу кључне речи „интерфејс“. |
Класе не подржавају вишеструко наслеђивање у Јави. | Интерфејси подржавају вишеструко наслеђивање у Јави. |
Класа садржи конструкторе. | Интерфејси не садрже конструкторе. |
Предмет не може да садржи апстрактне методе. | Интерфејси садрже само апстрактне методе. |
Класа може имати променљиве и методе које су подразумеване, јавне, приватне или заштићене. | Интерфејс подразумевано има само јавне променљиве и методе. |
Није обавезно повезивање модификатора који немају приступ променљивим класе. | Интерфејси могу имати променљиве које су статичке или коначне. |
Можемо наследити другу класу из класе. | Не можемо наследити класу са интерфејса. |
Класа се може наследити помоћу кључне речи ‘ектендс’. | Интерфејс може да примени друга класа помоћу кључне речи ‘имплементс’. Може га наследити други интерфејс помоћу кључне речи ‘ектендс’. |
Јава проширује Вс имплементације
‘Продужава’ | „Спроводи“ |
---|---|
Интерфејси подржавају само статичке и коначне модификаторе неприступа. | Сажетак подржава све модификаторе који немају приступ, попут статичких, коначних, нестатичних и не-коначних. |
Класа користи кључну реч ‘ектендс’ за наслеђивање из друге класе. | Кључну реч ‘имплементс’ користи класа за примену интерфејса. |
Класа која наслеђује другу класу може или не мора да замени све методе родитељске класе. | Класа која имплементира интерфејс мора да замени све апстрактне методе интерфејса. |
Помоћу кључне речи ектендс можемо истовремено проширити само једну класу. | Можемо да имплементирамо више интерфејса помоћу кључне речи ‘имплементс’. |
Интерфејс може проширити други интерфејс помоћу кључне речи ‘ектендс’. | Интерфејс не може да имплементира други интерфејс помоћу кључних речи „имплементс“. |
Може апстрактно применити интерфејс класе у Јави
Да, апстрактна класа може да имплементира интерфејс помоћу кључне речи ‘имплементс’. Апстрактна класа не мора да примењује све апстрактне методе интерфејса. Али у целини је добра пракса дизајна имати интерфејс са свим апстрактним методама, затим апстрактну класу која примењује овај интерфејс, а затим конкретне класе.
Доље је дат пример такве примене у Јави.
Овде је јава.утил.Лист интерфејс. Овај интерфејс имплементира јава.утил.АбстрацтЛист. Тада се ова класа АбстрацтЛист проширује са две конкретне класе, тј. ЛинкедЛист и АрраиЛист.
Да су класе ЛинкедЛист и АрраиЛист директно имплементирале интерфејс Лист, тада би морали да примене све апстрактне методе интерфејса Лист.
Али у овом случају, класа АбстрацтЛист примењује методе интерфејса Листа и прослеђује их ЛинкедЛист и АрраиЛист. Дакле, овде добијамо предност декларисања типа из интерфејса и апстрактне флексибилности класе у примени уобичајеног понашања.
Када користити апстрактну класу и интерфејс у Јави
Углавном користимо апстрактну класу да дефинишемо подразумевано или уобичајено понашање подређених класа које ће се протезати од ове апстрактне класе. Интерфејс се користи за дефинисање уговора између два система који међусобно делују у апликацији.
Одређене специфичне ситуације су идеалне за употребу интерфејса и одређених проблема који се могу решити само коришћењем апстрактних класа. У овом одељку ћемо разговарати о томе када можемо да користимо интерфејс и када можемо да користимо апстрактне класе.
Када користити интерфејс:
- Интерфејси се углавном користе када имамо малу сажету функционалност за примену.
- Када имплементирамо АПИ-је и знамо да се они неко време неће променити, тада се одлучујемо за интерфејсе.
- Интерфејси нам омогућавају да применимо вишеструко наслеђивање. Стога када треба да применимо вишеструко наслеђивање у нашој апликацији, користимо интерфејсе.
- Када имамо широк спектар објеката, опет су интерфејси бољи избор.
- Такође када морамо да пружимо заједничку функционалност многим неповезаним класама, и даље се користе интерфејси.
Када се користи апстрактна класа:
- Апстрактне класе углавном се користе када у нашој апликацији треба да користимо наследство.
- Како се интерфејси баве јавним методама и променљивим, кад год желимо да у свом програму користимо нејавне модификаторе приступа, користимо апстрактне класе.
- Ако треба додати нове методе, боље је то радити у апстрактној класи него у интерфејсу. Јер ако у интерфејс додамо нову методу, целокупна имплементација се мења јер интерфејси имају само прототипове метода, а имплементација класе која користи интерфејс ће обезбедити имплементацију.
- Ако желимо да се развијају различите верзије компонената, онда идемо на апстрактну наставу. Апстрактне часове можемо лакше променити. Али интерфејси се не могу мењати. Ако желимо нову верзију, онда морамо поново да напишемо цео интерфејс.
- Када желимо да пружимо заједничку имплементацију за све компоненте, тада је апстрактна класа најбољи избор.
Интерфејс против апстрактне класе у Јави
Доље су дате неке разлике између класа Интерфејси и Сажетак у Јави.
Интерфејс | Апстрактни час |
---|---|
Интерфејс се декларише помоћу кључне речи „интерфејс“. | Апстрактна класа се декларише помоћу кључне речи ‘абстрацт’. |
Интерфејс се може применити помоћу кључне речи ‘имплементс’. | Сажетак се може наследити помоћу кључне речи ‘ектендс’. |
Интерфејс не може проширити класу или имплементирати интерфејс, већ може проширити само други интерфејс. | Апстрактна класа може проширити класу или имплементирати више интерфејса. |
Чланови интерфејса могу бити само јавни. | Чланови класе сажетака могу бити јавни, приватни или заштићени. |
Интерфејс се не може користити за пружање имплементације. Може се користити само као декларација. | Апстрактна класа се може користити за примену интерфејса. |
Вишеструко наслеђивање може се постићи помоћу интерфејса. | Апстрактна класа не подржава вишеструко наслеђивање. |
Интерфејси могу имати само апстрактне методе. Из Јаве 8 може имати статичке и подразумеване методе. | Апстрактна класа може имати апстрактну или апстрактну методу. |
Наслеђивање Енума у Јави
Разматрали смо енум типове података у нашој расправи о типовима података на Јави. Све енуме се протежу од класе јава.ланг.Енум. Ова класа јава.ланг.Енум је апстрактна класа.
Такође, све енум класе у Јави су подразумевано „финалне“. Дакле, покушај наслеђивања класе из било које класе енум резултира грешком компајлера.
Како Јава не дозвољава вишеструко наслеђивање, не можемо наследити енум класу ни од једне друге класе, јер енум класа већ наслеђује од јава.ланг.Енум. Међутим, енум класе могу да имплементирају интерфејсе у Јави и то се назива наслеђивање Енум у Јави.
Доље је дат пример наслеђа Енум у Јави.
//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 } }
Излаз:
Овде имамо интерфејс ВеекДаис са прототипом апстрактне методе дисплаидаис (). Затим дефинишемо енум класу Даис која имплементира ВеекДаис интерфејс. Овде дефинишемо вредности набрајања од НЕДЕЉЕ до СУБОТЕ и такође надјачавамо методу приказа дана.
Коначно, у главној методи приступамо вредности набрајања и приказујемо је.
Често постављана питања
П # 1) Шта се дешава ако у интерфејс дате тело методе?
Одговор: За верзије Јаве пре Јаве 8, тело методе није дозвољено у интерфејсу. Али пошто Јава 8, можемо да дефинишемо подразумеване или статичке методе унутар интерфејса.
П # 2) Може ли интерфејс имати променљиве у Јави 8?
Одговор: У Јава 8 можемо имати константне променљиве помоћу статичких и завршних модификатора. Али у Јава интерфејсима не можемо имати променљиве инстанце. Сваки покушај декларисања променљивих инстанце у интерфејсу резултираће грешком компајлера.
П # 3) Која су побољшања у интерфејсима у Јави 8?
Одговор: Најважније побољшање за интерфејсе у Јави 8 је то што су у интерфејсима дозвољене статичке и подразумеване методе. Можемо имати методе декларисане као статичке или задате и дефинисати их унутар интерфејса.
П # 4) Можемо ли заменити задати метод у Јава интерфејсу?
Одговор: Не. Није обавезно надјачати задани метод у интерфејсу. То је зато што када имплементирамо интерфејс у класи, тада је подразумевани метод класе доступан класи примене. Стога, користећи објекат класе имплементације, можемо приступити подразумеваној методи интерфејса.
П # 5) Могу ли интерфејси имати поља у Јави?
како пронаћи сигурносни кључ за рутер
Одговор: Да, у интерфејсима на Јави можемо имати поља или променљиве, али по подразумеваној вредности, сва та поља су статична, коначна и јавна.
Закључак
У овом упутству смо разговарали о променама направљеним на интерфејсима у Јави 8. Јава 8 је увела статичке и подразумеване методе у интерфејсима. Раније смо у интерфејсу могли имати само апстрактне методе. Али од Јаве 8 надаље можемо да дефинишемо подразумеване и статичке методе у Јави.
Такође, Јава 8 дозвољава употребу ламбда израза са функционалним интерфејсима у Јави. Затим смо такође разговарали о апстрактним класама и интерфејсима и видели када да користимо сваки од њих у Јави. Такође смо видели наследство енум-а на Јави.
Такође смо разговарали о неким разликама између проширења и примена, класе и интерфејса, апстрактне класе и интерфејса итд.
=> Овде проверите СВЕ Јава туторијале.
Препоручено читање
- Јава интерфејс и лекција са апстрактним часовима са примерима
- Упоредни и упоредни интерфејси у Јави
- ЛистИтератор сучеље у Јави са примерима
- Постављање интерфејса у Јави: Водич за постављање Јава-а са примерима
- Маркер интерфејс у Јави: серизибилан и клониран
- Метода дужине Јава низа () Метода са примерима
- Примена Јава-а: Стварање и извршавање Јава ЈАР датотеке
- Како се користи Јава тоСтринг метод?