Nadjačavanje Java metode

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 @Overridebilješke u našem primjeru. U Javi su bilješke metapodaci koje smo koristili za pružanje informacija kompajleru. Ovdje @Overridebilješ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 finali static.
  • 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 superključ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 publicili 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 protectedu superklasi Animal. Ista metoda ima publicspecifikator pristupa u podrazredu Pas. To je moguće jer publicpruž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.

Zanimljivi članci...