U ovom ćemo uputstvu uz primjere naučiti o nadjačavanju metoda u Javi.
U prošlom tutorialu saznali smo o nasljeđivanju. Nasljeđivanje je OOP svojstvo koje nam omogućuje izvođenje nove klase (potklase) iz postojeće klase (superklase). Podrazred nasljeđuje atribute i metode superrazreda.
Sada, ako je ista metoda definirana i u superklasi i u podklasi, tada metoda klase podklase nadjačava metodu superklase. To je poznato kao nadjačavanje metode.
Primjer 1: Nadjačavanje 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(); ) )
Izlaz :
Ja sam pas.
U gore navedenom programu displayInfo()
metoda je prisutna i u superklasi Animal i u podrazredu Dog.
Kada zovemo displayInfo()
pomoću objekta d1 (objekt potklase), poziva se metoda unutar potklase Dog. displayInfo()
Metoda podrazreda nadjačava istu metodu superclass.
Primijetite upotrebu @Override
bilješke u našem primjeru. U Javi su bilješke metapodaci koje smo koristili za pružanje informacija kompajleru. Ovdje @Override
bilješka navodi kompajler da metoda nakon ove bilješke nadjačava metodu superklase.
Nije obvezno koristiti @Override
. Međutim, kada to koristimo, metoda bi trebala slijediti sva pravila nadjačavanja. Inače će prevoditelj generirati pogrešku.
Pravila nadjačavanja Java
- I superklasa i podklasa moraju imati isto ime metode, isti tip povratka i isti popis parametara.
- Ne možemo nadjačati metodu deklariranu kao
final
istatic
. - Uvijek bismo trebali nadjačati apstraktne metode superrazreda (o kojima će se raspravljati u sljedećim vodičima).
super ključna riječ u Java Overriding
Uobičajeno pitanje koje se postavlja tijekom izvršavanja nadjačavanja na Javi je:
Možemo li pristupiti metodi superklase nakon nadjačavanja?
Pa, odgovor je Da . Da bismo pristupili metodi superrazreda iz podrazreda, koristimo super
ključnu riječ.
Primjer 2: Upotreba super ključne riječi
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(); ) )
Izlaz :
Ja sam životinja. Ja sam pas.
U gornjem primjeru podrazred Pas nadjačava metodu displayInfo()
superrazreda Životinja.
Kada metodu pozivamo displayInfo()
pomoću objekta d1 podklase Dog, poziva se metoda unutar podklase Dog; metoda unutar superklase se ne poziva.
Unutar displayInfo()
podrazreda pas, nekada super.displayInfo()
smo nazivali displayInfo()
nadrazred.
Važno je napomenuti da se konstruktori u Javi ne nasljeđuju. Dakle, u Javi ne postoji takva stvar kao što je nadjačavanje konstruktora.
Međutim, konstruktor superklase možemo nazvati iz njegovih podrazreda. Za to koristimo super()
. Da biste saznali više, posjetite Java ključnu riječ super.
Specifičari pristupa u nadjačavanju metode
Ista metoda deklarirana u superklasi i njezinim podrazredima može imati različite specifikatore pristupa. Međutim, postoji ograničenje.
Možemo koristiti samo one specifikatore pristupa u potklasama koji pružaju veći pristup od specifikatora pristupa superklase. Na primjer,
Pretpostavimo, myClass()
deklarirana je metoda u superklasi protected
. Zatim, ista metoda myClass()
u podrazredu može biti public
ili protected
, ali ne private
.
Primjer 3: Specifikator pristupa u nadjačavanju
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(); ) )
Izlaz :
Ja sam pas.
U gornjem primjeru podrazred Pas nadjačava metodu displayInfo()
superrazreda Životinja.
Kad god zovemo displayInfo()
pomoću d1 (objekt podrazreda), poziva se metoda unutar podrazreda.
Primijetite da displayInfo()
je deklarirano protected
u superklasi Animal. Ista metoda ima public
specifikator pristupa u podrazredu Pas. To je moguće jer public
pruža veći pristup od protected
.
Nadjačavanje apstraktnih metoda
U Javi su stvorene apstraktne klase da bi bile superklase ostalih klasa. A, ako klasa sadrži apstraktnu metodu, obavezno ju je nadjačati.
U kasnijim tutorijalima naučit ćemo više o apstraktnim predavanjima i nadjačavanju apstraktnih metoda.