what is polymorphism java tutorial with examples
Tento výukový program vysvetľuje príklady toho, čo je polymorfizmus v Jave, typy polymorfizmu a ako implementovať polymorfizmus v čase kompilácie:
Slovo „polymorfizmus“ pochádza z dvoch slov, t.j. „Poly“ čo znamená veľa a „ morphs ”Čo znamená formy. Polymorfizmus teda znamená mnoho podôb. V programovacom jazyku môžeme povedať, že objekt môže mať mnoho podôb, a preto je objekt polymorfný.
Polymorfizmus je jednou z najdôležitejších vlastností OOP a umožňuje nám vyjadriť vlastnosť (objekt alebo správu alebo metódu alebo operátora) v rôznych formách.
=> Tu si pozrite príručku Java Beginners Guide.
Čo sa dozviete:
Úvod do polymorfizmu v Jave
Polymorfná entita sa v rôznych scenároch správa odlišne.
Napríklad, zvážte operátor „+“ (doplnok) v Jave. Toto je binárny operátor a trvá dva operandy. Keď sú operandmi, ktoré sa odovzdajú operátoru „+“, čísla, vykoná sa operácia sčítania, ktorá vráti súčet dvoch čísel.
Keď sa operandy zmenia na typ String, operátor „+“ nepridá objekty typu String, ale spojí alebo spojí obsah reťazca a vytvorí výsledný tretí reťazec.
Napríklad, ak „ jeden “A„ dva ”Sú potom obsahom dvoch objektov String „Jeden“ + „dva“ bude mať za následok „ raz dva “. Toto je zreťazenie.
V Jave sú všetky objekty polymorfné, pretože všetky sú odvodené z triedy „Object“, a tým spĺňajú vzťah „IS-A“ s triedou Object.
K objektu sa vždy pristupuje prostredníctvom referenčnej premennej daného konkrétneho typu triedy. Po deklarácii referenčnej premennej konkrétneho typu ju nie je možné upraviť. Ak však referenčná premenná nie je deklarovaná ako „konečná“, môžeme ju znova priradiť tak, aby ukazovala na iné objekty.
Typ tohto odkazu na objekt rozhodne o metódach alebo funkciách triedy, ktoré by sa mali volať.
Napríklad,ak existuje trieda ABC a trieda XYZ odvodené z ABC, obe triedy majú polymorfnú metódu func ().
class ABC{ void func(){} } class XYZ extends ABC{ void func() {} }
Vytvorme odkaz na typ ABC.
obj = new XYZ ();
Teraz, keď voláme metódu func (), pretože objekt, na ktorý odkazuje obj, je triedy XYZ, bude vyvolaná metóda func () z triedy XYZ.
Ako sme videli vo vyššie uvedenom príklade, metóda func () má rôzne implementácie, ale rovnaký prototyp. V závislosti od objektu, na ktorý odkazuje referenčný objekt, máme v danom scenári vyvolanú príslušnú implementáciu. Toto je polymorfizmus.
Poďme sa podrobne venovať polymorfizmu v Jave.
Príklad polymorfizmu Java
Poďme pochopiť jednoduchý príklad polymorfizmu v Jave s operáciou pridania, ako sme už hovorili.
Tu používame dve metódy s rovnakým názvom, ale rôznymi parametrami. Prvá funkcia prijíma dva celočíselné parametre a druhá metóda prijíma dva parametre reťazca.
V závislosti od typu odovzdaných parametrov sa zavolá príslušná metóda, ktorá buď pridá dve celé čísla a vytlačí výsledok, alebo spojí dva reťazce a vytlačí výsledný reťazec.
Program Java je uvedený nižšie:
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 } }
Výkon:
Tu sme videli, že keď prvýkrát odovzdáme dva celočíselné parametre add_func, potom sa volá prvá metóda. V druhom volaní funkcie odovzdáme dva parametre typu String, a preto sa volá druhá preťažená metóda.
Typy polymorfizmu
Java podporuje dva typy polymorfizmu:
- Polymorfizmus v čase kompilácie
- Polymorfizmus za behu
Ako naznačuje názov, polymorfizmus v čase kompilácie sa vykonáva v čase kompilácie a polymorfizmus za behu sa vykonáva za behu programu.
Ako je znázornené na vyššie uvedenom obrázku, polymorfizmus v čase kompilácie sa implementuje prostredníctvom preťaženia. Môžeme preťažiť buď metódu, alebo operátor. Runtime polymorfizmus sa dosahuje prepísaním.
V tomto výučbe sa budeme podrobne zaoberať polymorfizmom v kompilácii. Runtime polymorfizmu sa budeme venovať v ďalšom návode.
Polymorfizmus v čase kompilácie v Jave
Polymorfizmus v čase kompilácie je tiež známy ako „Statický polymorfizmus“. Ako súčasť polymorfizmu kompilácie sa akýkoľvek polymorfizmus má vykonať, vykonáva sa v čase kompilácie.
V Jave sa polymorfizmus v čase kompilácie vykonáva pomocou „ Metóda preťaženia “. Pomocou preťaženia metód môžeme mať jednu alebo viac metód s rovnakým názvom a diferencovaných iba na čísla alebo typ alebo poradie parametrov.
Preťaženie metód je najbežnejšou implementáciou polymorfizmu v čase kompilácie v Jave. Java podporuje aj preťaženie operátora.
Čo je to všeobecne preťaženie v Jave?
Preťaženie v prostredí Java je proces, ktorý obsahuje viac ako jednu metódu s rovnakým názvom a návratovým typom, ktorá sa však líši v poradí, počte a druhoch argumentov. Všeobecne sa tiež nazýva preťaženie metód.
Preťaženie metód v prostredí Java
Preťaženie metódy je implementácia polymorfizmu v čase kompilácie v Jave. Keď máme jednu alebo viac metód s rovnakým názvom a / alebo návratovými typmi, ale s rôznymi zoznamami parametrov, potom hovoríme, že sme tieto metódy „preťažili“.
Takže v danej triede môžeme mať rôzne metódy s rovnakým názvom, ale s rôznymi zoznamami argumentov.
Ako vyvoláme preťažené metódy? Alebo ako kompilátor vie, ktorá metóda sa má volať?
Vyvolanie presnej metódy, ktorá sa zhoduje s volaním, sa vykonáva v závislosti od zoznamu parametrov.
Už sme videli, že trieda v Jave môže mať viac ako jedného konštruktora. V prípade konštruktorov je zoznam argumentov alebo argumentov, ktoré konštruktér akceptuje, vo všetkých konštruktoroch iný. Toto je príklad preťaženia. Preťaženie konštruktora je teda základnou formou preťaženia metódy v Jave.
Teraz sa pozrime, ako preťažiť metódu v Jave?
Java poskytuje tri spôsoby preťaženia metód v závislosti od variácií v zozname parametrov / argumentov.
# 1) Typ parametrov
Metódy v Jave môžeme preťažiť v závislosti od dátového typu parametrov.
Zvážte nasledujúci príklad, kde sme uviedli prototypy troch metód.
sčítanie (int, int);
doplnenie (int, float);
sčítanie (Reťazec, Reťazec);
Ako je zrejmé z vyššie uvedeného, vo všetkých troch prípadoch máme rovnaký názov metódy a rovnaký počet parametrov, ale každé volanie metódy má rôzne typy parametrov.
Pokiaľ teda majú metódy rôzne typy parametrov, môžeme povedať, že sú preťažené. Keď vyvoláme metódu, kompilátor rozhodne o dátovom type parametra a v závislosti od dátového typu zoznamu parametrov poskytnutého s volaním metódy sa vyvolá príslušná metóda.
Napríklad,ak máme volanie metódy ako je uvedené nižšie:
pridanie (3, 3,5);
Vo vyššie uvedenom volaní metódy môžeme vidieť, že prvý parameter je typu int, zatiaľ čo druhý parameter je typu float. Keď sa vyskytne vyššie uvedené volanie, kompilátor vyrieši zoznam parametrov a potom vyvolá príslušnú metódu, ktorá je druhou vyššie uvedenou metódou.
Teraz implementujme kompletný program Java, ktorý demonštruje preťaženie metódy na základe dátových typov parametrov.
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 ) } }
Výkon:
# 2) Počet parametrov
Ďalšou implementáciou preťaženia metód je preťaženie metód s rôznym počtom parametrov volania funkcií.
Napríklad,uvažujme nasledujúce deklarácie metód:
addnum (int, int);
addnum (int, int, int);
Vo vyššie uvedených deklaráciách metódy má prvá deklarácia metódy dva parametre a druhá deklarácia má tri parametre. Keď je vyvolaná funkcia, kompilátor skontroluje počet parametrov a potom vhodne vyrieši volanie metódy.
Nasledujúci príklad ukazuje program, ktorý používa preťaženie metód na základe počtu parametrov.
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 ) } }
Výkon:
V tomto príklade máme dve metódy preťažené na základe počtu parametrov. Prvá metóda má jeden parameter a druhá metóda má dva parametre. V hlavnej metóde voláme obe metódy jednu za druhou a kompilátor rozlišuje volanie funkcií v závislosti od počtu zadaných parametrov.
# 3) Postupnosť parametrov
Tretí prístup implementácie preťaženia metódy je založený na postupnosti parametrov v preťažených metódach.
Uvažujme o nasledujúcom príklade deklarácie metódy,
suma (int, float);
suma (float, int);
Tu máme preťaženú metódu súčtu. V prvej deklarácii sú parametre int a float. Aj v druhej deklarácii sú parametre int a float, ale ich poradie v zozname parametrov sa zmení.
Teraz sa ako prvý zobrazuje parameter float, zatiaľ čo parameter int je druhý. Preťaženie metódy môžeme dosiahnuť zmenou poradia parametrov.
The program Java to demonštruje.
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) } }
Výkon:
Vo vyššie uvedenom programe máme preťaženú metódu printParam, ktorá má parametre int a char, ktorých poradie sa mení v dvoch deklaráciách metódy.
Neplatné prípady preťaženia metódy
Doteraz sme diskutovali o preťažení metód pomocou zoznamu parametrov. Zatiaľ sme neuvažovali nad návratovým typom metódy. Upozorňujeme, že nepreťažujeme metódy založené na návratových typoch.
Napríklad ak majú dve metódy rovnaký názov a rovnaký zoznam parametrov, ale odlišné typy návratnosti, nehovoríme, že sú tieto dve metódy preťažené. Tento prípad sa stáva neplatným pre preťaženie.
Takže ak máme nasledujúce vyhlásenia:
I int (int, int);
Súčet reťazcov (int, int);
V takom prípade kompilátor vydá chybu, pretože nie sú preťažené dve metódy. Metódy teda nie sú diferencované iba na základe návratových typov.
Ukážeme tento neplatný prípad pomocou programu Java.
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); } }
Vo vyššie uvedenom programe má metóda myMethod dva prototypy. Jeden prototyp má dva parametre int a vráti sa dvojnásobne. Prototyp druhej metódy má dva parametre int a vráti int.
Takže keď zostavujeme tento program, dostaneme výstup uvedený nižšie.
Výkon:
Vyššie uvedená chyba kompilácie naznačuje, že metóda je deklarovaná dvakrát. To znamená, že kompilátor nepovažuje tieto metódy za preťažené iba na základe návratového typu.
Preťaženie operátora
Preťaženie operátora je mechanizmus preťaženia, v ktorom má existujúci operátor iný význam.
Ako sme už diskutovali v úvodnej časti tohto tutoriálu, operátor sčítania „+“ je klasickým príkladom preťaženia operátora.
Keď sú operandy tohto operátora číselné, potom operátor + vráti celkom dve hodnoty. Ale keď sú operandy typu String, potom výsledkom operácie pridania je zreťazený reťazec. Upozorňujeme, že v Jave môžeme preťažiť iba operátor + (doplnenie).
Tento operátor vykonáva dve funkcie:
- Sčítanie celých čísel alebo číselných hodnôt.
- Zreťazenie reťazcov
Podpora preťaženia operátora je preto v Jave obmedzená na rozdiel od C ++, kde môžeme preťažiť takmer všetkých operátorov, okrem niekoľkých, ako sizeof, dot operator atď.
Nasledujúci program demonštruje preťaženie operátora v prostredí Java.
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 } }
Výkon:
príklady aplikácií klientskeho servera a webových aplikácií
Vo vyššie uvedenom programe sme preťažili operátor „+“. Keď do preťaženej metódy odovzdáme dve celočíselné hodnoty, vráti sa súčet dvoch celých čísel a pri odovzdaní dvoch reťazcov je výsledkom zreťazený reťazec.
Je potrebné poznamenať niektoré body týkajúce sa preťaženia a polymorfizmu v čase kompilácie.
- Preťaženie metód je spôsob implementácie polymorfizmu v čase kompilácie, ktorý je tiež známy ako statický polymorfizmus.
- Statický polymorfizmus je tiež známy ako včasná väzba alebo väzba v čase kompilácie.
- Pretože väzba parametrov a volania funkcií sa deje v čase kompilácie, preťaženie sa nazýva väzba kompilácie času.
- Operátor „+“ v Java môžeme iba preťažiť a vykoná sčítanie dvoch celých čísel alebo zreťazenie dvoch reťazcov.
často kladené otázky
Otázka č. 1) Prečo potrebujeme polymorfizmus v Jave?
Odpoveď: Polymorfizmus nám umožňuje mať veľa implementácií pre jeden objekt. Vďaka preťaženiu metód nemusíme mať príliš veľa metód s rôznymi názvami, ktoré si ťažko pamätáme. Namiesto toho môžeme mať preťažené metódy, aby sme mohli mať jasnú implementáciu metód vykonávajúcich podobné funkcie.
Tiež prvoradé pomôcky pri správnej implementácii dedičstva, ktoré nám umožňujú jednoduchšie pridať do existujúcich tried viac funkcií.
Otázka 2) Čo je to Polymorfizmus OOP?
Odpoveď: Definícia polymorfizmu objektovo orientovaného programovania sa týka schopnosti programovacích jazykov implementovať jeden objekt v rôznych formách. Polymorfizmus je tiež definovaný ako schopnosť programu prepísať metódy z nadradenej triedy na odvodenú, aby mali ďalšie funkcie.
Otázka č. 3) Môžeme preťažiť a prekonať hlavnú metódu?
Odpoveď: Nie. Nemôžeme prepísať statickú hlavnú metódu. Aj keď môžeme preťažiť hlavnú metódu, JVM nikdy nebude volať preťaženú hlavnú metódu. Najlepšou odpoveďou teda nie je preťaženie alebo prekonanie hlavnej metódy.
Otázka č. 4) Môžu byť konštruktéri preťažení?
Odpoveď: Áno, môžeme preťažiť konštruktory v Jave rovnako, ako preťažíme metódy Java. Konštruktory majú zvyčajne rovnaký názov, ale rôzny počet argumentov.
Otázka č. 5) Prečo je preťaženie metódy užitočné?
Odpoveď: Čistý kód môžeme napísať pomocou preťaženia metód a tiež sa stane čitateľným, pretože máme metódy s rovnakým názvom. Pokiaľ teda implementujeme funkcionalitu pre rôzne dátové typy, môžeme metódy preťažiť a bude ľahšie oddeliť kód.
Záver
Polymorfizmus v Jave znamená, že objekt môže mať mnoho podôb. Polymorfizmus v Jave má dva typy, tj. Polymorfizmus v čase kompilácie a polymorfizmus za behu. Polymorfizmus v čase kompilácie sa vykonáva v čase kompilácie. Polymorfizmus v čase kompilácie je statický a je implementovaný preťažením metód a preťažením operátorov.
Runtime polymorfizmus sa vykonáva za behu a je dynamický. Implementuje sa pomocou prepísania metódy.
V tomto tutoriáli sme videli spôsoby implementácie preťaženia metód. Podrobne sme diskutovali aj o preťažení operátora. Java podporuje preťaženie iba operátora „+“.
=> Prečítajte si sériu Easy Java Training Series.
Odporúčané čítanie
- Java String obsahuje () Výukový program metód s príkladmi
- Metóda Java String length () s príkladmi
- Metóda Java substring () - návod s príkladmi
- Výukový program Java Float s príkladmi programovania
- Výukový program JAVA pre začiatočníkov: viac ako 100 praktických výučbových programov Java Video
- TreeMap In Java - návod s príkladmi Java TreeMap
- Výukový program pre Java String Metódy reťazca Java s príkladmi
- Výukový program Java s príkladmi programovania