what is polymorphism java tutorial with examples
Tento kurz vysvětluje, co je Polymorfismus v Javě, typy polymorfismu a jak implementovat polymorfismus v době kompilace, na příkladech:
Slovo „Polymorfismus“ pochází ze dvou slov, tj. „Poly“ což znamená mnoho a „ morphs „Což znamená formy. Polymorfismus tedy znamená mnoho forem. V programovacím jazyce můžeme říci, že objekt může mít mnoho podob, a proto je objekt polymorfní.
Polymorfismus je jednou z nejdůležitějších vlastností OOP a umožňuje nám vyjádřit prvek (objekt nebo zprávu nebo metodu nebo operátora) v různých formách.
=> Prohlédněte si příručku Java Beginners Guide zde.
Co se naučíte:
Úvod do polymorfismu v Javě
Polymorfní entita se chová odlišně v různých scénářích.
Například, zvažte operátor „+“ (doplněk) v Javě. Toto je binární operátor a trvá dva operandy. Když jsou operandy předávané operátoru „+“ čísla, provede se operace přidání, která vrací součet dvou čísel.
Když se operandy změní na typ String, operátor „+“ nepřidá objekty String, ale zřetězí nebo spojí obsah řetězce a vytvoří výsledný třetí řetězec.
Například, pokud „ jeden ' a ' dva „Jsou tedy obsahem dvou řetězcových objektů „Jedna“ + „dvě“ bude mít za následek „ jedna, dvě “. To je zřetězení.
V Javě jsou všechny objekty polymorfní, protože všechny jsou odvozeny ze třídy „Object“ a splňují tak vztah „IS-A“ se třídou Object.
K objektu se vždy přistupuje prostřednictvím referenční proměnné daného konkrétního typu třídy. Jakmile je deklarována referenční proměnná konkrétního typu, nelze ji upravit. Pokud však referenční proměnná není deklarována jako „konečná“, můžeme ji znovu přiřadit, aby ukazovala na jiné objekty.
Typ tohoto odkazu na objekt rozhodne o metodách třídy nebo funkcích, které by se měly volat.
Například,pokud existuje třída ABC a třída XYZ odvozená z ABC, obě třídy mají polymorfní metodu func ().
class ABC{ void func(){} } class XYZ extends ABC{ void func() {} }
Vytvořme odkaz typu ABC.
obj = new XYZ ();
Nyní, když voláme metodu func (), protože objekt, na který ukazuje obj, je třídy XYZ, bude vyvolána metoda func () ze třídy XYZ.
Jak jsme viděli ve výše uvedeném příkladu, metoda func () má různé implementace, ale stejný prototyp. V závislosti na objektu, na který ukazuje referenční objekt, máme v daném scénáři vyvolanou příslušnou implementaci. To je polymorfismus.
Pojďme se podrobně zabývat polymorfismem v Javě.
která vrstva modelu os pracuje s rámy?
Příklad polymorfismu Java
Pojďme pochopit jednoduchý příklad polymorfismu v Javě s operací přidání, jak bylo popsáno výše.
Zde používáme dvě metody se stejným názvem, ale různými parametry. První funkce přijímá dva celočíselné parametry a druhá metoda přijímá dva parametry řetězce.
V závislosti na typu předaných parametrů se vyvolá příslušná metoda a buď přidá dvě celá čísla a vytiskne výsledek, nebo zřetězí dva řetězce a vytiskne výsledný řetězec.
Program Java je uveden níže:
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ýstup:
Zde jsme viděli, že když poprvé předáme dva celočíselné parametry add_func, pak se volá první metoda. Ve druhém volání funkce předáme dva parametry typu String, a proto se volá druhá přetížená metoda.
Druhy polymorfismu
Java podporuje dva typy polymorfismu:
- Polymorfismus v době kompilace
- Polymorfismus za běhu
Jak název napovídá, polymorfismus v době kompilace se provádí v době kompilace a polymorfismus za běhu se provádí za běhu.
Jak je znázorněno na výše uvedeném obrázku, polymorfismus v době kompilace je implementován prostřednictvím přetížení. Můžeme přetížit metodu nebo operátor. Runtime polymorfismu je dosaženo pomocí přepsání.
V tomto kurzu se budeme podrobně zabývat polymorfismem kompilace. V dalším kurzu pojmeme runtime polymorfismus.
Polymorfismus v čase kompilace v Javě
Polymorfismus v době kompilace je také známý jako „Statický polymorfismus“. Jako součást polymorfismu v době kompilace se provádí jakýkoli polymorfismus v době kompilace.
V Javě se polymorfismus v době kompilace provádí pomocí „ Přetížení metody “. Pomocí přetížení metody můžeme mít jednu nebo více metod se stejným názvem a diferencovaných pouze na čísla nebo typ nebo pořadí parametrů.
Přetížení metody je nejběžnější implementací polymorfismu v době kompilace v Javě. Java také podporuje přetížení operátora.
Co je přetížení v Javě obecně?
Přetížení v Javě je proces, který má více než jednu metodu se stejným názvem a návratovým typem, ale liší se v pořadí, počtu a typech argumentů. Obecně se to také nazývá přetížení metody.
Přetížení metody v Javě
Přetížení metody je implementace polymorfismu v době kompilace v Javě. Když máme jednu nebo více metod se stejným názvem a / nebo návratovými typy, ale s různými seznamy parametrů, pak říkáme, že jsme metody „přetížili“.
Takže v dané třídě můžeme mít různé metody se stejným názvem, ale s různými seznamy argumentů.
Jak vyvoláme přetížené metody? Nebo jak kompilátor ví, která metoda má být volána?
Vyvolání přesné metody, která odpovídá volání, se provádí v závislosti na seznamu parametrů.
Už jsme viděli, že třída v Javě může mít více než jednoho konstruktora. V případě konstruktorů se seznam argumentů nebo argumenty, které konstruktor přijímá, liší ve všech konstruktorech. Toto je příklad přetížení. Přetížení konstruktoru je tedy základní forma přetížení metody v Javě.
Nyní se podívejme, jak přetížit metodu v Javě?
Java poskytuje tři způsoby přetížení metody v závislosti na variacích v seznamu parametrů / argumentů.
# 1) Typ parametrů
V Javě můžeme metody přetížit v závislosti na datovém typu parametrů.
Zvažte následující příklad, kde jsme uvedli prototypy tří metod.
sčítání (int, int);
přidání (int, float);
přidání (řetězec, řetězec);
Jak je vidět shora, máme ve všech třech případech stejný název metody a stejný počet parametrů, ale každé volání metody má různé typy parametrů.
Takže pokud metody mají různé typy parametrů, můžeme říci, že jsou metody přetížené. Když vyvoláme metodu, kompilátor rozhodne o datovém typu parametru a v závislosti na datovém typu seznamu parametrů poskytovaného s voláním metody je volána příslušná metoda.
Například,pokud máme volání metody jako níže:
přidání (3, 3,5);
Ve výše uvedeném volání metody vidíme, že první parametr je typu int, zatímco druhý parametr je typu float. Když dojde k výše uvedenému volání, kompilátor vyřeší seznam parametrů a poté vyvolá příslušnou metodu, což je druhá metoda výše.
Nyní provedeme kompletní program Java, abychom demonstrovali přetížení metody na základě datových typů parametrů.
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ýstup:
# 2) Počet parametrů
Další implementace přetížení metody je přetížením metod s jiným počtem parametrů ve volání funkce.
Například,uvažujme následující deklarace metody:
addnum (int, int);
addnum (int, int, int);
jaké jsou nejlepší anime weby
Ve výše uvedených deklaracích metody má první deklarace metody dva parametry a druhá deklarace má tři parametry. Když je vyvolána funkce, kompilátor zkontroluje počet parametrů a poté vhodně vyřeší volání metody.
Níže uvedený příklad ukazuje program, který používá přetížení metody na základě počtu parametrů.
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ýstup:
V tomto příkladu máme dvě metody přetížené na základě počtu parametrů. První metoda má jeden parametr a druhá metoda má dva parametry. V hlavní metodě voláme obě metody jednu po druhé a kompilátor řeší volání funkce v závislosti na počtu zadaných parametrů.
# 3) Pořadí parametrů
Třetí přístup implementace přetížení metody je založen na posloupnosti parametrů v přetížených metodách.
Zvažte následující příklad deklarace metody,
součet (int, float);
součet (float, int);
Zde máme přetížený součet metody. V první deklaraci jsou parametry int a float. Ve druhé deklaraci jsou také parametry int a float, ale jejich pořadí v seznamu parametrů se změní.
Nyní se parametr float zobrazí jako první, zatímco parametr int je druhý. Můžeme dosáhnout přetížení metody změnou pořadí parametrů.
The níže program Java to ukazuje.
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ýstup:
Ve výše uvedeném programu máme metodu přetíženou printParam, která má parametry int a char, jejichž pořadí se mění ve dvou deklaracích metody.
Neplatné případy přetížení metody
Zatím jsme diskutovali o přetížení metody pomocí seznamu parametrů. Dosud jsme neuvažovali o návratovém typu metody. Všimněte si, že nepřetěžujeme metody založené na návratových typech.
Například pokud dvě metody mají stejný název a stejné seznamy parametrů, ale různé návratové typy, pak neříkáme, že jsou tyto dvě metody přetíženy. Tento případ se stane neplatným pro přetížení.
Takže pokud máme následující prohlášení:
I int (int, int);
Řetězcový součet (int, int);
V tomto případě kompilátor vydá chybu, protože nejsou přetíženy dvě metody. Proto pouze na základě návratových typů nejsou metody rozlišeny.
Ukážeme tento neplatný případ pomocí 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); } }
Ve výše uvedeném programu má metoda myMethod dva prototypy. Jeden prototyp má dva int parametry a vrací dvojnásobek. Prototyp druhé metody trvá dva parametry int a vrací int.
Když tedy kompilujeme tento program, dostaneme níže uvedený výstup.
nejlepší bezplatný čistič disku Windows 10
Výstup:
Výše uvedená chyba kompilace označuje, že metoda je deklarována dvakrát. To znamená, že kompilátor nepovažuje tyto metody za přetížené pouze na základě návratového typu.
Přetížení operátora
Přetížení operátoru je mechanismus přetížení, ve kterém má existující operátor jiný význam.
Jak jsme již diskutovali v úvodní části tohoto tutoriálu, operátor přidání „+“ je klasickým příkladem přetížení operátoru.
Když jsou operandy tohoto operátoru číselné, vrátí operátor + celkem dvě hodnoty. Ale když jsou operandy typu String, výsledkem operace přidání je zřetězený řetězec. Všimněte si, že v Javě můžeme přetížit pouze operátor + (přidání).
Tento operátor vykonává dvě funkce:
- Přidání celých čísel nebo číselných hodnot.
- Zřetězení řetězců
Podpora přetížení operátorů je proto v Javě omezená na rozdíl od C ++, kde můžeme přetížit téměř všechny operátory blokující několik jako sizeof, dot operator atd.
Níže uvedený program demonstruje přetížení operátora v Javě.
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ýstup:
Ve výše uvedeném programu jsme přetížili operátor „+“. Když předáme dvě celočíselné hodnoty přetížené metodě, vrátí se součet dvou celých čísel a při předání dvou řetězců je výsledkem zřetězený řetězec.
Je třeba si uvědomit určité body týkající se přetížení a polymorfismu v době kompilace.
- Přetížení metody je způsob implementace polymorfismu v době kompilace, který je také známý jako statický polymorfismus.
- Statický polymorfismus je také známý jako časná vazba nebo vazba v době kompilace.
- Protože vazba parametrů a volání funkce probíhá v době kompilace, přetížení se nazývá vazba kompilace času.
- V Javě můžeme přetížit pouze operátor „+“, který provede přidání dvou celých čísel nebo zřetězení dvou řetězců.
Často kladené otázky
Otázka č. 1) Proč potřebujeme polymorfismus v Javě?
Odpovědět: Polymorfismus nám umožňuje mít mnoho implementací pro jeden objekt. Díky přetížení metody nemusíme mít příliš mnoho metod s různými názvy, které si lze jen těžko zapamatovat. Místo toho můžeme mít přetížené metody, abychom mohli mít jasnou implementaci metod provádějících podobné funkce.
Také přepsání pomůcek při správné implementaci dědičnosti, které nám umožňuje snadněji přidat do stávajících tříd více funkcí.
Otázka č. 2) Co je polymorfismus OOP?
Odpovědět: Definice polymorfismu objektově orientovaného programování odkazuje na schopnost programovacích jazyků implementovat jeden objekt v různých formách. Polymorfismus je také definován jako schopnost programu přepsat metody z nadřazené třídy do odvozené třídy, aby měla další funkce.
Otázka č. 3) Můžeme přetížit a přepsat hlavní metodu?
Odpovědět: Ne. Nemůžeme přepsat statickou hlavní metodu. I když můžeme přetížit hlavní metodu, JVM nikdy nebude volat přetíženou hlavní metodu. Nejlepší odpovědí tedy není přetížení nebo přepsání hlavní metody.
Otázka č. 4) Mohou být konstruktéři přetíženi?
Odpovědět: Ano, můžeme přetížit konstruktory v Javě stejným způsobem, jako přetížíme metody Java. Konstruktory mají obvykle stejný název, ale odlišný počet argumentů.
Otázka č. 5) Proč je přetížení metody užitečné?
Odpovědět: Můžeme napsat čistý kód pomocí přetížení metody a také se stane čitelným, protože máme metody se stejným názvem. Takže pokud implementujeme funkčnost pro různé datové typy, můžeme metody přetížit a bude jednodušší oddělit kód.
Závěr
Polymorfismus v Javě znamená, že objekt může mít mnoho podob. Polymorfismus v Javě má dva typy, tj. Polymorfismus v době kompilace a polymorfismus za běhu. Polymorfismus v době kompilace se provádí v době kompilace. Polymorfismus v době kompilace je statický a je implementován přetížením metody a přetížením operátora.
Runtime polymorfismus se provádí za běhu a je dynamický. Implementuje se pomocí přepsání metody.
V tomto kurzu jsme viděli způsoby implementace přetížení metody. Také jsme podrobně diskutovali o přetížení operátoru. Java podporuje přetížení pouze operátoru „+“.
=> Přečtěte si řadu Easy Java Training Series.
Doporučené čtení
- Java String obsahuje () Výukový program metod s příklady
- Metoda Java String length () S příklady
- Metoda Java substring () - výuka s příklady
- Výukový program Java Float s příklady programování
- Výukový program JAVA pro začátečníky: 100+ praktických výukových programů Java Video
- TreeMap v Javě - výuka s příklady Java TreeMap
- Výukový program Java String | Metody řetězců Java s příklady
- Výukový program Java s příklady programování