Java - Nadjačavanje Java metode


U prošloj lekciji saznali smo o nasljeđivanju. Nasljeđivanje je OOP svojstvo koje nam omogućava da izvedemo novu klasu (potklasu) iz postojeće klase (superklasu). Potklasa nasljeđuje atribute i metode superklase. Sada, ako je ista metoda definisana i u klasi superklase i u klasi podklase, tada metoda klase podklase poništava metodu superklase. Ovo je poznato kao nadjačavanje (overriding) metode.


Primjer 1: Nadjačavanje (overriding) metode

class Animal {
   public void displayInfo() {
      System.out.println("Ja sam životinja.");
   }
}

class Dog extends Animal {
   @Override
   public void displayInfo() {
      System.out.println("Ja sam pas.");
   }
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

U gornjem programu, metoda displayInfo() prisutna je i u superklasi Animal i u podklasi Dog. Kada pozivamo displayInfo() koristeći objekt d1 (objekt podklase), poziva se metoda unutar podklase Dog. Metoda displayInfo() podklase poništava istu metodu superklase.



Primijetite upotrebu napomene @Override u našem primjeru. U Javi su napomene metapodaci koje smo koristili za pružanje informacija kompajleru. Ovdje, napomena @Override navodi kompajler da metoda nakon ove napomene nadjačava metodu superklase.

Nije obavezno koristiti @Override. Međutim, kada ovo koristimo, metoda bi trebala sljediti sva pravila nadjačavanja. U suprotnom, kompajler će generisati grešku.



Pravila nadjačavanja u Javi

  • I superklasa i podklasa moraju imati isto ime metode, isti tip povratka i isti popis parametara.
  • Ne možemo nadjačati metodu koja je proglašena konačnom i statičnom.
  • Uvijek bismo trebali nadjačati apstraktne metode superklase (o tome će biti riječi u kasnijim lekcijama).


super ključna riječ u Java nadjačavanju (Overriding)

Uobičajeno pitanje koje se postavlja prilikom izvršavanja poništavanja u Javi: Možemo li pristupiti metodi superklase nakon nadjačavanja? Pa, odgovor je Da. Da bismo pristupili metodi superklase iz podklase, koristimo ključnu riječ super.


Primjer 2: Upotreba super ključne riječi

class Animal {
   public void displayInfo() {
      System.out.println("Ja sam životinja.");
   }
}

class Dog extends Animal {
   public void displayInfo() {
      super.displayInfo();
      System.out.println("Ja sam pas.");
   }
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

U gornjem primjeru, podklasa Dog nadjačava metodu displayInfo() superklase Animal. Kada zovemo metodu displayInfo() koristeći d1 objekt podklase Dog, poziva se metoda unutar podklase Dog; metoda unutar superklase se ne poziva.

Unutar displayInfo() potklase Dog, koristili smo super.displayInfo() za pozivanje displayInfo() superklase. 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 njegove podklase. Za to koristimo super(). Da biste saznali više, posjetite lekciju Java super ključnu riječ.




Specifičari pristupa u nadjačavanju metoda

Ista metoda deklarisana u superklasi i njenim podklasama može imati različite specifikatore pristupa. Međutim, postoji ograničenje. Možemo koristiti samo one specifikatore pristupa u podklasama koji pružaju veći pristup od specifikatora pristupa superklase. Na primjer:

Pretpostavimo da je metoda myClass() u superklasi proglašena zaštićenom. Zatim, ista metoda myClass() u podklasi može biti ili javna ili zaštićena, ali ne i privatna.


Primjer 3: Specifikator pristupa u nadjačavanju

class Animal {
   protected void displayInfo() {
      System.out.println("Ja sam životinja.");
   }
}

class Dog extends Animal {
   public void displayInfo() {
      System.out.println("Ja sam pas.");
   }
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

U gornjem primjeru, podklasa Dog nadjačava metodu displayInfo() superklase Animal. Kad god pozivamo metodu displayInfo() koristeći d1 (objekt podklase), poziva se metoda unutar podklase.

Primijetite da je displayInfo() proglašen zaštićenim u superklasi Animal. Ista metoda ima specifikator javnog pristupa u podklasi Dog. To je moguće jer javni pristup pruža veći pristup od zaštićenog.



Nadjačavanje (Overriding) apstraktnih metoda

U Javi su apstraktne klase stvorene da budu superklasa ostalih klasa. A, ako klasa sadrži apstraktnu metodu, obavezno ju je nadjačati. U kasnijim lekcijama naučićemo više o apstraktnim klasama i nadjačavanju apstraktnih metoda.