what is polymorphism java tutorial with examples
Овај водич објашњава шта је полиморфизам у Јави, типови полиморфизма и како применити полиморфизам током компајлирања са примерима:
Реч „полиморфизам“ потиче од две речи, тј. 'Поли' што значи много и „ морпхс ”Значење облика. Према томе, полиморфизам значи многе облике. У програмском језику можемо рећи да објекат може имати више облика, па је стога и полиморфан.
Полиморфизам је једна од најважнијих карактеристика ООП-а и омогућава нам да изразимо особину (објекат или поруку или методу или оператора) у различитим облицима.
=> Овде погледајте водич за почетнике Јава.
Шта ћете научити:
Увод у полиморфизам у Јави
Полиморфни ентитет се различито понаша у различитим сценаријима.
На пример, размотрите оператор ‘+’ (сабирање) у Јави. Ово је бинарни оператор и узима два операнда. Када су операнди који се прослеђују оператору „+“ бројеви, врши се операција сабирања која враћа збир два броја.
Када се операнди промене у Стринг тип, оператор ‘+’ не додаје Стринг објекте, већ спаја или придружује садржај низа да би се добио трећи резултујући низ.
На пример, ако ' један ' и ' два ”Су тада садржаји два Стринг објекта „Један“ + „два“ резултираће „ један два ”. Ово је спајање.
У Јави су сви објекти полиморфни јер су сви изведени из класе „Објецт“ и тако испуњавају везу „ИС-А“ са класом Објецт.
Објекту се увек приступа преко референтне променљиве тог одређеног типа класе. Једном када је референтна променљива одређеног типа декларисана, она се не може изменити. Међутим, ако референтна променљива није декларисана као „Коначна“, можемо је доделити тако да указује на друге објекте.
Тип ове референце објекта одлучује о методама или функцијама класе које треба позвати.
На пример,ако постоји АБЦ класа и класа КСИЗ изведене из АБЦ, обе класе имају полиморфну методу фунц ().
class ABC{ void func(){} } class XYZ extends ABC{ void func() {} }
Направимо референцу типа АБЦ.
obj = new XYZ ();
Сада када позивамо методу фунц (), пошто је објекат на који указује обј класе КСИЗ, биће позвана метода фунц () из класе КСИЗ.
Као што смо видели у горњем примеру, метода фунц () има различите примене, али исти прототип. У зависности од објекта на који упућује референтни објекат, у том сценарију се позива одговарајућа имплементација. Ово је полиморфизам.
Размотримо детаљно полиморфизам у Јави.
Пример полиморфизма Јава
Хајде да разумемо једноставан пример полиморфизма у Јави са операцијом сабирања о којој је раније било речи.
Овде користимо две методе са истим именом, али различитим параметрима. Прва функција прихвата два целобројна параметра, а друга метода два параметра низа.
У зависности од врсте прослеђених параметара, позива се одговарајући метод који додаје две целобројне вредности и исписује резултат или спаја два низа и исписује резултујући низ.
Јава програм је дат у наставку:
class Addition_operation{ //method to add two integers void addition_func(int num1,int num2){ System.out.println('ABC::addition_func:' + (num1+num2)); } //overloaded method to add two strings void addition_func(String str1, String str2){ String result = str1 + ' ' + str2; System.out.println('XYZ::addition_func:' + result); } } public class Main { public static void main(String() args) { Addition_operation abc = new Addition_operation(); //create a class object abc.addition_func (3,4); //calls 1st method abc.addition_func ('Hello' , 'World!'); //calls 2nd method } }
Излаз:
Овде смо видели да када први пут проследимо два целобројна параметра у адд_фунц, тада се позива прва метода. У другом позиву функције просљеђујемо два параметра типа Стринг и стога се позива друга преоптерећена метода.
Врсте полиморфизма
Јава подржава две врсте полиморфизма:
- Полиморфизам компајлираног времена
- Полиморфизам током извођења
Као што и само име говори, полиморфизам времена компајлирања изводи се током времена компајлирања, а полиморфизам времена извршавања се врши током извођења.
Као што је приказано на горњој слици, полиморфизам компајлираног времена имплементиран је преко преоптерећења. Можемо преоптеретити метод или оператор. Полиморфизам током извођења постиже се преко замене.
У овом упутству детаљно ћемо разговарати о полиморфизму компајлираног времена. У следећем упутству ћемо се позабавити полиморфизмом извођења.
Временски полиморфизам у Јави
Полиморфизам компајлирања познат је и као „статички полиморфизам“. Као део полиморфизма током компајлирања, било који полиморфизам који се треба извести, изводи се у време компајлирања.
У Јави се полиморфизам времена компајлирања врши помоћу „ Преоптерећење метода ”. Користећи преоптерећење метода, можемо имати једну или више метода са истим именом и само диференциране по бројевима или типу или редоследу параметара.
Преоптерећење метода је најчешћа примена полиморфизма времена компајлирања у Јави. Јава такође подржава преоптерећење оператера.
Шта је преоптерећење у Јави уопште?
Преоптерећење у Јави је процес који има више метода са истим именом и типом повратка, али се разликује у секвенци, броју и врстама аргумената. Уопште се назива и преоптерећење метода.
Преоптерећење метода у Јави
Преоптерећење метода је примена полиморфизма времена компајлирања у Јави. Када имамо једну или више метода са истим именом и / или повратним типовима, али различитим листама параметара, тада кажемо да смо их „преоптеретили“.
Дакле, у датој класи можемо имати разне методе са истим именом, али различите листе аргумената.
Како се позивамо на преоптерећене методе? Или како компајлер зна који ће се метод позвати?
Позивање тачне методе која одговара позиву врши се у зависности од листе параметара.
Већ смо видели да класа у Јави може имати више конструктора. У случају конструктора, списак аргумената или аргумената које конструктор прихвата је различит у свим конструкторима. Ово је пример преоптерећења. Дакле, преоптерећење конструктора је основни облик преоптерећења метода у Јави.
Сада да видимо како преоптеретити метод у Јави?
Јава пружа три начина преоптерећења метода у зависности од варијација на листи параметара / аргумената.
# 1) Тип параметара
Можемо преоптеретити методе у Јави у зависности од типа података параметара.
Размотрите следећи пример у коме смо дали прототипове три методе.
сабирање (инт, инт);
сабирање (инт, флоат);
сабирање (Стринг, Стринг);
Као што се види одозго, имамо исто име методе у сва три случаја и исти број параметара, али сваки позив методе има различите врсте параметара.
Дакле, све док методе имају различите врсте параметара, можемо рећи да су методе преоптерећене. Када позивамо методу, компајлер одлучује о типу података параметра, а у зависности од типа података листе параметара који се добија уз позив методе, позива се одговарајућа метода.
На пример,ако имамо позив методе као доле:
сабирање (3, 3.5);
У горњем позиву методе можемо видети да је први параметар типа инт, док је други параметар типа флоат. Када се наиђе на горњи позив, компајлер решава листу параметара, а затим позива одговарајућу методу која је друга горња метода.
Сада ћемо применити комплетан Јава програм да демонстрирамо преоптерећење методе на основу типова података параметара.
class MethodOverload { //overloaded method - char parameter public void printParam(char ch) { System.out.println('Input character:' + ch); } //overloaded method - int parameter public void printParam(int num) { System.out.println('Input Number:' + num); } } class Main { public static void main(String args()) { MethodOverload obj = new MethodOverload(); obj.printParam('A'); //call overloaded method (char ) obj.printParam(10); //call overloaded method (int ) } }
Излаз:
# 2) Број параметара
Друга примена преоптерећења метода је преоптерећењем метода са различитим бројем параметара у позиву функције.
На пример,размотримо следеће декларације метода:
адднум (инт, инт);
адднум (инт, инт, инт);
У горњим декларацијама метода, прва декларација методе има два параметра, а друга декларација има три параметра. Када се функција позове, компајлер проверава број параметара, а затим на одговарајући начин решава позив методе.
Следећи пример приказује програм који користи преоптерећење метода на основу броја параметара.
class MethodOverload { //overloaded method - 1 parameter public void printParam(char ch) { System.out.println(ch); } //overloaded method - 2 parameters public void printParam(char ch, int num) { System.out.println('Character: ' + ch + ' ; '+ 'Number:' +num); } } class Main { public static void main(String args()) { MethodOverload obj = new MethodOverload(); obj.printParam('A'); //call overloaded method (1 ) obj.printParam('A',10); //call overloaded method (2 ) } }
Излаз:
У овом примеру имамо две методе преоптерећене на основу броја параметара. Прва метода узима један параметар, а друга метода узима два параметра. У главној методи позивамо обе методе једну за другом и преводилац разрешава позив функције у зависности од броја наведених параметара.
# 3) Редослед параметара
Трећи приступ примене преоптерећења метода заснован је на низу параметара у преоптерећеним методама.
Размотрите следећи пример декларације методе,
сума (инт, флоат);
сума (флоат, инт);
Овде имамо преоптерећени збир метода. У првој декларацији, параметри су инт и флоат. У другој декларацији, параметри су инт и флоат, али се њихов редослед у листи параметара мења.
Сада се параметар флоат појављује први, док је параметар инт други. Преоптерећење метода можемо постићи променом редоследа параметара.
Тхе испод Јава програм то показује.
class MethodOverload { //overloaded method - char,int parameter public void printParam(char ch, int num) { System.out.println('Input character:' + ch + ' ; ' + 'Input Number:' + num); } //overloaded method - int,char parameter public void printParam(int num, char ch) { System.out.println('Input Number:' + num + ' ; ' + 'Input Character:' + ch); } } class Main { public static void main(String args()) { MethodOverload obj = new MethodOverload(); obj.printParam('A', 100); //call overloaded method (char,int) obj.printParam(100, 'A'); //call overloaded method (int,char) } }
Излаз:
У горњем програму имамо принтПарам преоптерећену методу која има инт и цхар параметре чији се редослед мења у две декларације метода.
Неваљани случајеви преоптерећења методе
До сада смо разговарали о преоптерећењу методе помоћу листе параметара. Још увек нисмо разматрали методу повратка. Имајте на уму да не преоптерећујемо методе засноване на типовима повратка.
На пример, ако две методе имају исто име и исте листе параметара, али различите врсте повратка, онда не кажемо да су ове две методе преоптерећене. Овај случај постаје неважећи због преоптерећења.
Дакле, ако имамо следеће декларације:
скл тест питања и одговори пдф
Ја инт (инт, инт);
Збир низа (инт, инт);
У овом случају, компајлер ће издати грешку јер две методе нису преоптерећене. Дакле, методе се не разликују само на основу врста повратка.
Демонстрирајмо овај неваљани случај помоћу Јава програма.
class OverloadDemo { public double myMethod(int num1, int num2) { System.out.println('OverloadDemo::myMethod returns double'); return num1+num2; } public int myMethod(int var1, int var2) { System.out.println('OverloadDemo::myMethod returns int'); return var1-var2; } } class Main { public static void main(String args()) { OverloadDemo obj2= new OverloadDemo(); obj2.myMethod(10,10); obj2.myMethod(20,12); } }
У горњем програму, метода миМетход има два прототипа. Један прототип узима два инт параметра и враћа двоструко. Прототип друге методе узима два инт параметра и враћа инт.
Дакле, када компајлирамо овај програм, добићемо доњи излаз.
Излаз:
Горња грешка компилације указује да је метода декларисана два пута. То значи да компајлер не сматра ове методе преоптерећеним само на основу типа ретурн.
Преоптерећење оператера
Преоптерећење оператора је механизам преоптерећења у којем се постојећем оператору даје различито значење.
Као што смо расправљали у уводном одељку овог водича, оператор сабирања ‘+’ је класичан пример преоптерећења оператора.
Када су операнди овог оператора нумерички, тада + оператор враћа укупно две вредности. Али када су операнди типа Стринг, онда је резултат операције сабирања спојени низ. Имајте на уму да у Јави можемо само преоптеретити + (додавање) оператора.
Овај оператер обавља две функције:
- Додавање целих бројева или нумеричких вредности.
- Спајање низова
Отуда је подршка за преоптерећење оператора ограничена на Јави, за разлику од Ц ++ где можемо преоптеретити готово све операторе који имају неколико попут сизеоф, дот оператор итд.
Програм у наставку показује преоптерећење оператора у Јави.
class OperatorOverload { //overloaded method for concatenating two strings void operator(String str1, String str2) { String resultStr = str1 + str2; System.out.println('Concatenated String: ' + resultStr); } //overloaded method for adding two numbers void operator(int num1, int num2) { int result = num1 + num2; System.out.println('Sum of two numbers : ' + result); } } class Main { public static void main(String() args) { OperatorOverload obj = new OperatorOverload(); obj.operator(10, 15); //add two numbers obj.operator('Hello ', 'World!!'); //concatenate two strings } }
Излаз:
У горњем програму смо преоптеретили оператор „+“. Када преоптерећеној методи проследимо две целобројне вредности, враћа се збир две целобројне вредности, а када се проследе два низа, резултат је спојени низ.
Треба напоменути одређене тачке у вези са преоптерећењем и полиморфизмом током компајлирања.
- Преоптерећење метода је начин за примену полиморфизма током компајлирања који је познат и као статички полиморфизам.
- Статички полиморфизам је познат и као рано везивање или везивање током компајлирања.
- Како се везивање параметара и позива функције дешава у време компајлирања, преоптерећење се назива везивање времена компајлирања.
- Можемо само преоптеретити оператер ‘+’ у Јави и он врши сабирање две целобројне вредности или спајање две струне.
Често постављана питања
П # 1) Зашто нам је потребан полиморфизам у Јави?
Одговор: Полиморфизам нам омогућава да имамо више примена за један објекат. Преоптерећењем метода не треба имати превише метода са различитим именима која је тешко запамтити. Уместо тога можемо имати преоптерећене методе тако да можемо имати јасну примену метода које извршавају сличне функције.
Такође надјачавање помагала у правилној имплементацији наслеђивања што нам омогућава да на лакши начин додамо више функционалности постојећим класама.
П # 2) Шта је полиморфизам ООП?
Одговор: Дефиниција полиморфизма оријентисаног на програмирање односи се на способност програмских језика да имплементирају један објекат у различитим облицима. Полиморфизам се такође дефинише као способност програма да замени методе из родитељске класе у изведену класу да би имао додатну функционалност.
П # 3) Можемо ли преоптеретити и надјачати главни метод?
Одговор: Не. Не можемо заменити статички главни метод. Иако можемо преоптеретити главни метод, ЈВМ никада неће позвати преоптерећени главни метод. Дакле, најбољи одговор је не преоптеретити или занемарити главни метод.
П # 4) Могу ли се конструктори преоптеретити?
Одговор: Да, можемо преоптеретити конструкторе у Јави на исти начин као и Јава методе. Конструктори обично имају исто име, али различит број аргумената.
П # 5) Зашто је преоптерећење метода корисно?
Одговор: Можемо да напишемо чисти код користећи преоптерећење метода, а он такође постаје читљив јер имамо методе са истим именом. Дакле, ако примењујемо функционалност за различите типове података, онда можемо преоптеретити методе и биће лакше раздвојити код.
Закључак
Полиморфизам у Јави значи да објекат може имати више облика. Полиморфизам у Јави има два типа, тј. Полиморфизам компајлирања и полиморфизам времена извођења. Полиморфизам компајлирања врши се у време компајлирања. Полиморфизам компајлираног времена је статичан и имплементиран је преоптерећењем метода и преоптерећењем оператора.
Рунтиме полиморфизам се изводи током извођења и динамичан је. Примењује се применом методе која замењује.
У овом упутству видели смо начине за примену преоптерећења метода. Такође смо детаљно разговарали о преоптерећењу оператера. Јава подржава преоптерећење само оператора „+“.
=> Прочитајте серију Еаси Јава Траининг.
Препоручено читање
- Јава Стринг садржи () Водич за методе са примерима
- Метода дужине Јава низа () Метода са примерима
- Метода Јава подниз () - Водич са примерима
- Водич за Јава Флоат са примерима програмирања
- Водич за ЈАВА за почетнике: 100+ практичних Јава видео водича
- ТрееМап у Јави - Водич за примере Јава ТрееМап
- Јава Стринг Водич | Јава стринг методе са примерима
- Јава двострука лекција са примерима програмирања