12. Ključna riječ super

Ključna riječ super u javi je referentna varijabla koja se koristi da uputi na objekt neposredne roditeljske klase. Kadgod se kreira instanca podklase, instanca roditeljske klase se kreira implicitno, tj. na nju upućuje referentna varijabla super. Upotreba ključne riječi super

  1. super se koristi da uputi na instansnu varijablu neposredne roditeljske klase.
  2. super() se koristi da pozove konstruktor neposredne roditeljske klase.
  3. super se koristi da pozove metodu neposredne roditeljske klase.

Super se koristi da uputi na instansnu varijablu neposredne roditeljske klase

Problem bez ključne riječi super

class Vehicle{  
  int speed=50;  
}  
class Bike3 extends Vehicle{  
  int speed=100;  
  void display(){  
   System.out.println(speed); //ispisuje brzinu (speed) za Bike   
  }  
  public static void main(String args[]){  
   Bike3 b=new Bike3();  
   b.display();  
}  
}

Ispis na ekranu:
100

U ovom primjeru obe klase Vehicle i Bike imaju zajedničku osobinu speed. Na instansnu varijablu tekuće klase upućuje instanca po defaultu, ali pošto moramo da uputimo na instansnu varijablu roditeljske klase moramo da koristimo ključnu riječ super da bi se napravila razlika između instansne varijable roditeljske klase i instansne varijable tekuće klase. Rješenje sa ključnom riječi super

class Vehicle{  
  int speed=50;  
}  
  
class Bike4 extends Vehicle{  
  int speed=100;  
      
  void display(){  
   System.out.println(super.speed); //sada će ispisati brzinu (speed) za Vehicle   
  }  
  public static void main(String args[]){  
   Bike4 b=new Bike4();  
   b.display();  
}  
}

Ispis na ekranu:
50

Super() se koristi da pozove konstruktor neposredne roditeljske klase

Ključna riječ super može se takođe upotrijebiti da pozove konstruktor roditeljske klase kao u sljedećem primjeru:

class Vehicle{  
  Vehicle(){System.out.println("Vehicle je kreiran");}  
}  
  
class Bike5 extends Vehicle{  
  Bike5(){  
   super(); //poziva konstruktor roditeljske klase  
   System.out.println("Bike je kreiran");  
  }  
  public static void main(String args[]){  
   Bike5 b=new Bike5();  
}  
}

Ispis na ekranu:
Vehicle je kreiran
Bike je kreiran

Napomena: super() se dodaje u konstruktor svake klase automatski od strane kompajlera.

Kao što je poznato podrazumijevani (default) konstruktor obezbjeđuje kompajler automatski ali on takođe dodaje super() kao prvu naredbu. Ako kreiramo svoj vlastiti konstruktor, a nemamo ni this() ni super() kao prvu naredbu, kompajler će obezbijediti super() kao prvu naredbu konstruktora. Primjer za ključnu riječ super gdje je super() implicitno obezbijeđen od strane kompajlera

class Vehicle{  
  Vehicle(){System.out.println("Vehicle je kreiran");}  
}  
  
class Bike6 extends Vehicle{  
  int speed;  
  Bike6(int speed){  
    this.speed=speed;  
    System.out.println(speed);  
  }  
  
  public static void main(String args[]){  
    Bike6 b=new Bike6(10);  
  }  
}

Ispis na ekranu:
Vehicle je kreiran
10

Super se koristi da pozove metodu neposredne roditeljske klase

Ključna riječ super može se takođe upotrijebiti da pozove metodu roditeljske klase. Ovo treba koristiti u slučaju kada podklasa sadrži istu metodu kao roditeljska klasa, kao u sljedećem primjeru:

class Person{  
void message(){System.out.println("welcome");}  
}  
  
class Student16 extends Person{  
void message(){System.out.println("welcome to java");}  
  
void display(){  
message(); //poziva metodu message() tekuće klase  
super.message(); //poziva metodu message() roditeljske klase  
}  
  
public static void main(String args[]){  
Student16 s=new Student16();  
s.display();  
}  
}

Ispis na ekranu:
welcome to java
welcome

U ovom primjeru obe klase Student i Person imaju metodu message(), pa ako pozovemo metodu message() iz klase Student, to će pozvati metodu message() klase Student, a ne klase Person zato što se prioritet daje lokalno. U slučaju da u podklasi ne postoji metoda kao u roditeljskoj klasi, nema potrebe da se koristi super. U sljedećem primjeru metoda message() je pozvana iz klase Student ali klasa Student nema metodu message(), tako da se metoda message() može pozvati direktno. Program gdje ključna riječ super nije potrebna

class Person{  
void message(){System.out.println("welcome");}  
}  
  
class Student17 extends Person{  
  
void display(){  
message(); //poziva metodu message() roditeljske klase 
}  
  
public static void main(String args[]){  
Student17 s=new Student17();  
s.display();  
}  
}

Ispis na ekranu:
welcome

Zadaci iz ovog poglavlja    Objektno orijentisano programiranje u Javi    Index