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 superklasi i u klasi podklase, tada metoda 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 metodu 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 povratni tip 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).


Ključna riječ super 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 ključne riječi super

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 pozivamo metodu displayInfo() koristeći d1 objekt podklase Dog, poziva se metoda unutar podklase Dog(). Metoda unutar superklase se ne poziva. Unutar metode 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, konstruktora superklase možemo pozvati iz njegove podklase. Za to koristimo ključnu riječ super(). Da biste saznali više, pogledajte lekciju Java ključnu riječ - super.



Specifični 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.