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
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
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
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