java override method overriding
Tento výukový program vysvětluje, jak dosáhnout běhového polymorfismu v Javě pomocí přepsání metody a poznámky @override s jednoduchými příklady:
Koncept polymorfismu a polymorfismus v době kompilace jsme již podrobně probrali. V tomto tutoriálu budeme pokračovat v Runtime polymorfismu v Javě.
Na rozdíl od polymorfismu v době kompilace, ve kterém je volání metody vyřešeno v době kompilace, v runtime polymorfismu je volání metody vyřešeno za běhu.
=> Zkontrolujte VŠECHNY výukové programy Java zde.
Co se naučíte:
Runtime polymorfismus v Javě
Běhový polymorfismus, který je také známý jako dynamický polymorfismus nebo Odeslání dynamické metody je technika, ve které je přepsané volání metody vyřešeno dynamicky za běhu.
Runtime polymorfismus v Javě je dosažen pomocí „ přepsání metody “. Přepsání metody je technika, kterou je metoda v nadřazené třídě předefinována nebo přepsána v podřízené třídě.
Když je metoda přepsána ve třídě, technika odeslání dynamické metody řeší volání přepsané metody za běhu a ne v době kompilace.
Dosáhněte běhového polymorfismu v Javě - přepsání metody
Přepsání metody je přístup, který používáme k dosažení běhového polymorfismu v Javě. Jak již bylo zmíněno, přepsání metody je technika, ve které podtřída přidává metodu, která je již přítomna ve své nadřazené třídě, a přidává k této metodě nové funkce. Pak říkáme, že je přepsána metoda základní třídy.
Nová metoda, kterou jsme definovali v podtřídě se stejným prototypem jako metoda mateřské třídy, ale odlišná implementace, se nazývá „ převažující metoda “ . Metoda v mateřské třídě je známá jako „ Přepsaná metoda “.
s čím otevřu jar soubory
Jakmile je metoda přepsána, zůstává otázkou, jak je vyřešeno volání této přepsané metody?
Obvykle voláme přepsanou metodu prostřednictvím odkazu na základní třídu. Vytvoříme odkaz na typovou základnu a poté pomocí nového klíčového slova přiřadíme podřízený objekt třídy.
Záleží tedy na obsahu referenční proměnné nebo na to, na který objekt odkazuje odkaz na základní třídu, který určuje, která metoda má být volána. Pokud tedy referenční objekty ukazují na objekt podřízené třídy, je volána přepisující metoda.
V opačném případě, pokud referenční objekt obsahuje objekt základní třídy, je volána přepsaná metoda. Jedním z témat, kterým musíme v běhovém polymorfismu rozumět, zejména pro odesílání dynamických metod, je „Upcasting“, které je vysvětleno níže.
Upcasting
Když referenční objekt nadřazené třídy, o kterém jsme hovořili výše, ukazuje nebo odkazuje na objekt podtřídy, pak jej nazýváme Upcasting.
Rozumíme upcastingu na jednoduchém příkladu.
Zvažte, že máme třídu „BaseClass“ a tuto BaseClass rozšíříme, abychom vytvořili novou třídu DerivedClass. Tato struktura vypadá, jak je znázorněno níže.
class BaseClass { ….//BaseClass code here } class DerivedClass extends BaseClass{ ….//DerivedClass code here }
Nyní implementovat upcasting budeme deklarovat referenční proměnnou typu BaseClass. Dále přiřadíme objekt DerivedClass k odkazu třídy BaseClass, jak je uvedeno v níže uvedeném příkazu kódu.
BaseClass base = new DerivedClass (); //Upcasting
Tady tedy můžeme říci, že jsme přenesli objekt DerivedClass na BaseClass. Pokud jde o runtime polymorfismus, je koncept upcastingu velmi důležitý.
Obecně tedy platí, že upcasting je proces přiřazování podřízených nebo podtřídních objektů k odkazu nadřazeného nebo nadtřídy.
SuperClass reference = new Subclass Object;
Níže uvedený program Java ukazuje přepsání metody a také ukazuje, jak se provádí upcasting k vyřešení přepsaných volání metod za běhu.
//base/parent class class Parent { void Print() //print method { System.out.println('Parent::Print() method'); } } //child class 1 inheriting from Parent class child1 extends Parent { void Print() //overridden print method { System.out.println('child1::Print() method'); } } //child class 2 inheriting from Parent class child2 extends Parent { void Print() //overridden print method { System.out.println('child2::Print() method'); } } class Main { public static void main(String() args) { Parent parent = new Parent(); parent.Print(); //executes parent Print () method parent = new child1(); //upcasting parent.Print(); //executes child1 Print () method parent = new child2(); //upcasting parent.Print(); //executes child2 Print () method
Výstup:
Ve výše uvedeném programu máme dvě třídy, tj. Child1 a child2, které jsou odvozeny z třídy „Parent“. Nadřazená třída má metodu „Tisk“, která je přepsána ve třídách child1 i child2. Poté v hlavní metodě vytvoříme referenční objekt nadřazené třídy s názvem ‚parent '.
Nejprve mu přiřadíme objekt třídy Parent a poté zavoláme metodu „Print ()“. Pak to opakujeme tak, že nejprve přiřadíme objekt child1 a potom objekt child2 k nadřazenému odkazu.
jak spustit spustitelný soubor jar
Výstup ukazuje, v závislosti na obsahu nadřazené reference, a je volána příslušná metoda tisku.
Výhody dynamického / běhového polymorfismu
- S dynamickým polymorfismem může programátor přepsat metody.
- Umožňuje třídám definovat metodu s obecnou implementací, kterou pak mohou její deriváty přepsat a poskytnout konkrétní implementaci.
- S dynamickým odesláním metody je volání metody vyřešeno za běhu, na rozdíl od přetížení, o kterém se rozhoduje v době kompilace. To umožňuje programátorům větší flexibilitu.
Protože runtime polymorfismus váže příslušnou metodu na volání v době běhu a my ji také voláme dynamická vazba nebo pozdní vazba . Polymorfismus v době kompilace na druhé straně podporuje statická vazba nebo časná vazba .
Statická vs. dynamická vazba
Statická vazba | Dynamická vazba |
---|---|
Volání metody vyřešené v době kompilace je statická vazba. | Volání metody vyřešené za běhu je dynamická vazba. |
Přetížení metody je příkladem statické vazby. | Příklad přepsání metody je příkladem dynamické vazby. |
Pro statickou vazbu se používají typy tříd a polí. | Objekty se používají pro dynamickou vazbu. |
Soukromé, konečné a statické entity používají statickou vazbu. | Virtuální metody používají dynamickou vazbu. |
Virtuální funkce / metoda v Javě
Virtuální funkce nebo metoda v Javě je funkce, která se používá s Runtime polymorfismem. Na rozdíl od C ++ Java nemá speciální „virtuální“ klíčové slovo k označení, že metoda je virtuální. Metoda, která je definována v základní třídě a přepsána v odvozené třídě, je virtuální.
V Javě je ve výchozím nastavení každá nestatická metoda kromě soukromé a konečné virtuální funkce. Všimněte si, že metody, které jsme diskutovali výše, přepsání implementace runtime polymorfismu, jsou také virtuální metody.
Protože statická metoda je vázána na Class a nelze ji volat pomocí objektu, nelze ji použít za běhového polymorfismu a také nejde o virtuální funkci.
Rozhraní v Javě jsou ve výchozím nastavení virtuální. Třídy implementující rozhraní poskytují implementace pro metody rozhraní. Stejně jako v běhovém polymorfismu je volání metod rozhraní řešeno také za běhu.
Nezapomeňte, že protože metody v rozhraní jsou navrženy tak, aby byly přepsány, všechny metody rozhraní jsou virtuální funkce.
Zvažte například následující kód:
interface car{ void accelerate(); } class Maruti implements car{ void accelerate () { System.out.println(“Maruti car accelerated!!”); } }
Ve výše uvedeném kódu je metoda accelerate () virtuální funkcí, protože je součástí vozu rozhraní a je navržena tak, aby byla přepsána.
@override Anotace v Javě
Anotace @override je výchozí anotace v Javě. Tato anotace byla zavedena v prostředí Java 1.5. Anotace @override se používá, když metoda podtřídy přepíše metodu nadtřídy.
Použitím anotace Java @override k označení, že metoda přepisuje metodu nadřazené třídy, kompilátor vydá varování, pokud není anotovaná metoda přepsána. Takže je povinné, aby byla metoda přepsána, když je použita anotace @override.
Zadruhé, pomocí anotace @override zajistíme, aby byl kód čitelnější. Můžeme si okamžitě uvědomit, že deklarovaná metoda má být přepsána.
Obecná syntaxe anotace Java @override je
public @interface override
Níže uvedený program Java ukazuje použití anotace @override.
//base class definition class BaseClass { public void display() { System.out.println('BaseClass::display () method'); } } //derived class inheriting base class class DerivedClass extends BaseClass { @Override //indicates the display method being overridden public void display() { System.out.println('DerivedClass::display () method'); } } // main class public class Main { public static void main(String args()) { System.out.println('@Override Example'); //BaseClass type object;contain child object BaseClass testObj = new DerivedClass(); //call display method based on contents of object i.e. derived class display () testObj.display(); } }
Výstup:
Ve výše uvedeném programu máme BaseClass, která definuje metodu zobrazení. Pak z této BaseClass odvodíme třídu DerivedClass a metodu zobrazení označíme anotací @override. Tato metoda je přepsána v DerivedClass.
V hlavní metodě vytvoříme odkaz na objekt BaseClass a ukážeme jej na objekt DerivedClass, který způsobí, že odkaz zavolá metodu zobrazení DerivedClass.
Pokud bychom ve třídě Derived neimplementovali metodu display (), pak by kompilátor dal varování kompilátoru, protože je označen anotací @override.
Přetížení a přepsání v Javě
Nyní, když jsme diskutovali o přetížení a přepsání v Javě, shrňme tyto dva koncepty.
Přetížení souvisí s polymorfismem v době kompilace, tj. Implementujeme polymorfismus v době kompilace pomocí přetížení. Přetížení se provádí dvěma způsoby, tj. Přetížení metody a přetížení operátoru.
jakou e-mailovou službu mám použít
Přetížení metody je technika, ve které máme více než jednu metodu se stejným názvem, ale s různými seznamy parametrů. Seznam parametrů se liší podle počtu parametrů, typů parametrů nebo sekvence parametrů.
Přetížení operátoru v Javě je omezené a umožňuje nám přetížit pouze operátor „+“, který se používá k přidání dvou čísel a zřetězení dvou řetězcových objektů.
Přetížení je vyřešeno v době kompilace a je statické. Také se tomu říká „Včasná vazba“ .
Metoda přepsání je funkce, pomocí které implementujeme runtime polymorfismus. V přepsání metody je metoda nadřazené třídy přepsána v podřízené třídě. To znamená, že prototyp metody v super a podtřídě zůstává stejný, ale implementace se liší.
Přepsání metody používá techniku odeslání dynamické metody k vyřešení volání metody a k rozhodnutí, zda zavolat metodu nadtřídy nebo podtřídy, a to se provádí za běhu.
Proto se runtime polymorfismus také nazývá dynamický polymorfismus nebo pozdní vazba.
Dále si vysvětlíme rozdíly mezi přetížením a přepsáním v Javě.
Přetížení Vs Přepsat v Javě
Přetížení | Převažující |
---|---|
Přetížení se používá v polymorfismu v době kompilace. | Přepsání je implementováno v běhovém polymorfismu. |
Lze provést ve stejné třídě. Může nebo nemusí vyžadovat dědictví. | Přepsání vždy vyžaduje dědičnost. |
Metody jsou přetíženy stejným názvem metody a jiným seznamem parametrů. | Přepsané metody mají stejné prototypy. |
Při přetížení metody se návratový typ nezvažuje. | Návratový typ by měl být stejný v přepsaných a přepisujících metodách. |
Zlepšuje čitelnost programu. | Přepsání umožňuje mít konkrétní implementační třídu moudrý. |
Často kladené otázky
Otázka č. 1) Můžeme přepsat statickou metodu?
Odpovědět: Ne. Statické metody nelze v Javě přepsat. Je to proto, že statické metody jsou založeny na třídách a jsou volány přímo třídou. Nepotřebují objekty k vyvolání za běhu. Statická metoda odeslání je tedy určena kompilátorem.
Otázka č. 2) Můžeme přepsat konstruktor?
Odpovědět: Ne, nemůžeme přepsat konstruktor. Při vytváření objektu se volá konstruktor. Nenazývá se to objektem. Jedním z požadavků přepsání je také přepsaná metoda a přepsaná metoda by měla mít stejný podpis metody, což v případě konstruktorů není možné.
Otázka č. 3) Proč je přepsání metody nazýváno jako dynamický polymorfismus?
Odpovědět: V případě přepsání metody je volání metody vyřešeno dynamicky za běhu. Proto se tomu říká dynamický polymorfismus.
Otázka č. 4) Jaké je použití dynamického polymorfismu v Javě?
Odpovědět: Dynamický polymorfismus používá techniku odeslání dynamické metody, která podporuje přepsání metody, takže podtřída může poskytnout konkrétní implementaci přepsané metody. Tímto způsobem můžeme implementovat specifické funkce, které nám umožňují psát efektivní programy.
Za druhé, také si nemusíme dělat starosti s řešením volání metod, protože odeslání dynamické metody rozhodne, kterou metodu zavolat.
Otázka č. 5) Jaký je rozdíl mezi statickou a dynamickou vazbou?
Odpovědět: Propojení mezi voláním metody a jeho implementací se nazývá vazba. Když je toto propojení vyřešeno v době kompilace, nazýváme to jako statická vazba. Když se vazba provádí dynamicky za běhu, pak ji nazýváme jako dynamická vazba.
Statická vazba používá datový typ třídy a pole k vyřešení volání metody. Dynamická vazba používá objekty k vyřešení volání metod. Statická vazba se také nazývá polymorfismus v době kompilace a dynamická vazba se také nazývá runtime polymorfismus.
Závěr
V tomto kurzu jsme podrobně probrali runtime polymorfismus v Javě.
Runtime polymorfismus je implementován pomocí přepsání metody. Přepsání metody se provádí v podtřídě, přičemž metoda definovaná v nadtřídě je předefinována nebo přepsána ve své podtřídě. Podpis metody zůstává v super a podtřídě stejný.
Pomocí přepsání metody můžeme poskytnout konkrétní implementaci stejné metody v podtřídě. Tímto způsobem můžeme psát efektivnější programy, které zahrnují dědičnost. Java poskytuje poznámku @override, která označuje, že má být metoda přepsána.
Ve výchozím nastavení jsou všechny nestatické metody, které nejsou konečné, v Javě virtuální. Všechny virtuální metody lze přepsat.
=> Dávejte pozor na jednoduchou sérii školení Java zde.
Doporučené čtení
- Přepsání předdefinovaných metod v Javě
- Metoda délky Java String () S příklady
- Co je polymorfismus v Javě - výukový program s příklady
- Jak používat metodu Java toString?
- Metoda Java String indexOf s příklady kódu
- Java String obsahuje () Výukový program metod s příklady
- Metoda Java String Split () - Jak rozdělit řetězec v Javě
- Metoda Java String compareTo s příklady programování