V tomto tutoriále sa pomocou príkladov dozvieme o prepísaní metód v Jave.
V minulom návode sme sa dozvedeli o dedičstve. Dedičnosť je vlastnosť OOP, ktorá nám umožňuje odvodiť novú triedu (podtriedu) od existujúcej triedy (nadtriedy). Podtrieda dedí atribúty a metódy nadtriedy.
Teraz, ak je rovnaká metóda definovaná v nadtriede aj v podtriede, potom metóda triedy podtriedy prepíše metódu nadtriedy. Toto sa nazýva prepísanie metódy.
Príklad 1: Prepísanie metódy
class Animal ( public void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( @Override public void displayInfo() ( System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Výstup :
Ja som pes.
Vo vyššie uvedenom programe je displayInfo()
metóda prítomná v podtriede Zviera aj v Podtriede Pes.
Keď voláme displayInfo()
pomocou objektu d1 (objektu podtriedy), zavolá sa metóda vo vnútri podtriedy Dog. displayInfo()
Spôsob podtriedy prepíše rovnakú metódu rodičovskej triedy.
Všimnite si použitie @Override
anotácie v našom príklade. V Jave sú anotácie metadáta, ktoré sme použili na poskytnutie informácií kompilátoru. Tu @Override
anotácia určuje kompilátor, že metóda po tejto anotácii má prednosť pred metódou nadtriedy.
Používanie nie je povinné @Override
. Keď to však použijeme, mala by metóda dodržiavať všetky pravidlá vyššie uvedeného. V opačnom prípade kompilátor vygeneruje chybu.
Pravidlá Java
- Nadtrieda aj podtrieda musia mať rovnaký názov metódy, rovnaký návratový typ a rovnaký zoznam parametrov.
- Metódu deklarovanú ako
final
a nemôžeme prepísaťstatic
. - Vždy by sme mali prepísať abstraktné metódy nadtriedy (o ktorých pojednáme v ďalších tutoriáloch).
super kľúčové slovo v Java Overriding
Bežná otázka, ktorá vyvstáva pri vykonávaní prepísania v Jave, je:
Môžeme po prepísaní získať prístup k metóde nadtriedy?
Odpoveď je áno . Na prístup k metóde nadtriedy z podtriedy používame super
kľúčové slovo.
Príklad 2: Použitie super kľúčového slova
class Animal ( public void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( public void displayInfo() ( super.displayInfo(); System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Výstup :
Som zviera. Ja som pes.
Vo vyššie uvedenom príklade má podtrieda Pes prednosť pred metódou displayInfo()
nadtriedy Animal.
Keď metódu zavoláme displayInfo()
pomocou objektu d1 podtriedy Dog, zavolá sa metóda vo vnútri podtriedy Dog; metóda vo vnútri nadtriedy sa nevolá.
Vo vnútri displayInfo()
podtriedy Dog sme zvykli super.displayInfo()
volať displayInfo()
nadtriedu.
Je dôležité si uvedomiť, že konštruktory v Jave sa nededia. Preto v Jave neexistuje nič také ako prepísanie konštruktora.
Z jej podtried však môžeme nazvať konštruktor nadtriedy. Na to používame super()
. Ak sa chcete dozvedieť viac, navštívte kľúčové slovo Java super.
Špecifikátory prístupu v prepísaní metódy
Rovnaká metóda deklarovaná v nadtriede a jej podtriedach môže mať rôzne špecifikátory prístupu. Existuje však obmedzenie.
Môžeme použiť iba tie špecifikátory prístupu v podtriedach, ktoré poskytujú väčší prístup ako špecifikátor prístupu nadtriedy. Napríklad,
Predpokladajme, myClass()
že je deklarovaná metóda v nadtriede protected
. Rovnaká metóda myClass()
v podtriede potom môže byť buď public
alebo protected
, ale nie private
.
Príklad 3: Špecifikátor prístupu pri prepísaní
class Animal ( protected void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( public void displayInfo() ( System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Výstup :
Ja som pes.
Vo vyššie uvedenom príklade má podtrieda Pes prednosť pred metódou displayInfo()
nadtriedy Animal.
Kedykoľvek zavoláme displayInfo()
pomocou d1 (objekt podtriedy), zavolá sa metóda vo vnútri podtriedy.
Všimnite si, že displayInfo()
je deklarované protected
v nadtriede Zviera. Rovnaká metóda má public
špecifikátor prístupu v podtriede Dog. To je možné, pretože public
poskytuje väčší prístup ako protected
.
Prevažujúce abstraktné metódy
V Jave sú abstraktné triedy vytvárané tak, aby boli nadtriedou ostatných tried. Ak trieda obsahuje abstraktnú metódu, je nevyhnutné ju prepísať.
Viac o abstraktných triedach a prekonaní abstraktných metód sa dozvieme v ďalších tutoriáloch.