V tej vadnici bomo s pomočjo primerov spoznali preglasitev metode v Javi.
V zadnji vaji smo izvedeli o dedovanju. Dedovanje je lastnost OOP, ki nam omogoča, da iz obstoječega razreda (superrazred) izpeljemo nov razred (podrazred). Podrazred podeduje atribute in metode nadrazreda.
Če je enaka metoda definirana tako v superrazredu kot tudi v podrazredu, potem metoda razreda podrazreda preglasi metodo nadrazreda. To je znano kot preglasitev metode.
Primer 1: Preglasitev metode
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(); ) )
Izhod :
Jaz sem pes.
V zgornjem programu je displayInfo()
metoda prisotna tako v superrazredu živali kot v podrazredu psov.
Ko prikličemo displayInfo()
z uporabo predmeta d1 (objekt podrazreda), se pokliče metoda znotraj podrazreda Dog. displayInfo()
Postopek podrazreda preglasi isto metodo nadrazreda.
Upoštevajte uporabo @Override
pripisa v našem primeru. V Javi so pripisi metapodatki, ki smo jih uporabili za zagotavljanje informacij prevajalniku. Tu @Override
pripis določa prevajalnik, da metoda po tem pripisu preglasi metodo nadrazreda.
Uporaba ni obvezna @Override
. Ko pa to uporabimo, mora metoda upoštevati vsa pravila razveljavitve. V nasprotnem primeru bo prevajalnik ustvaril napako.
Pravila preglasitve Java
- Tako superrazred kot podrazred morata imeti isto ime metode, isti tip vrnitve in enak seznam parametrov.
- Ne moremo preglasiti metode, razglašene kot
final
instatic
. - Vedno bi morali preglasiti abstraktne metode superrazreda (o njih bomo razpravljali v kasnejših vajah).
super ključna beseda v Java Overriding
Pogosto vprašanje, ki se pojavi med izvajanjem razveljavitve v Javi, je:
Ali lahko dostopimo do metode superrazreda po razveljavitvi?
No, odgovor je Da . Za dostop do metode superrazreda iz podrazreda uporabimo super
ključno besedo.
2. primer: Uporaba super ključne besede
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(); ) )
Izhod :
Jaz sem žival. Jaz sem pes.
V zgornjem primeru podrazred Dog preglasi metodo displayInfo()
nadrazreda Žival.
Ko prikličemo metodo displayInfo()
z uporabo predmeta d1 podrazreda Dog, se pokliče metoda znotraj podrazreda Dog; metoda znotraj superrazreda ni poklicana.
Znotraj displayInfo()
podrazreda Dog smo včasih super.displayInfo()
klicali displayInfo()
nadrazred.
Pomembno je omeniti, da konstruktorji v Javi niso podedovani. Zato v Javi ni takega, kot da bi preoblikoval konstruktor.
Konstruktor nadrazreda pa lahko pokličemo iz njegovih podrazredov. Za to uporabljamo super()
. Če želite izvedeti več, obiščite ključno besedo Java super.
Dostop do določevalnikov v preglasitvi metode
Ista metoda, deklarirana v nadrazredu in njegovih podrazredih, ima lahko različne specifikatorje dostopa. Vendar obstaja omejitev.
Specifikatorje dostopa lahko uporabimo samo v podrazredih, ki zagotavljajo večji dostop kot specifikator dostopa superklase. Na primer
Recimo, da myClass()
je deklarirana metoda v superrazredu protected
. Potem je lahko ista metoda myClass()
v podrazredu bodisi public
ali protected
, a ne private
.
Primer 3: Določnik dostopa v razveljavitvi
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(); ) )
Izhod :
Jaz sem pes.
V zgornjem primeru podrazred Dog preglasi metodo displayInfo()
nadrazreda Žival.
Kadarkoli pokličemo displayInfo()
z uporabo d1 (objekt podrazreda), se pokliče metoda znotraj podrazreda.
Upoštevajte, da displayInfo()
je označeno protected
v superrazredu za živali. Ista metoda ima public
specifikator dostopa v podrazredu Dog. To je mogoče, ker public
omogoča večji dostop kot protected
.
Prevladujoče abstraktne metode
V Javi so abstraktni razredi ustvarjeni kot nadrazred ostalih razredov. Če razred vsebuje abstraktno metodo, jo obvezno preglasite.
V naslednjih vajah bomo izvedeli več o abstraktnih razredih in preglasitvi abstraktnih metod.