U ovom ćemo uputstvu uz primjere naučiti o ključnoj riječi super u Javi.
super
Ključna riječ u Java se koristi u podrazreda za pristup superclass članova (atributa, graditelja i metode).
Prije nego što naučimo o super
ključnoj riječi, pobrinite se da znate o nasljeđivanju Java.
Upotreba super ključne riječi
- Pozvati metode superklase koja je nadjačana u podklasi.
- Pristup atributima (poljima) superklase ako i superklasa i podklasa imaju atribute s istim imenom.
- Da se iz konstruktora podklase izričito pozove superklasa no-arg (zadano) ili parametarski konstruktor.
Razumijemo svaku od ovih upotreba.
1. Pristup nadjačanim metodama superklase
Ako su metode s istim imenom definirane i u superklasi i u podrazredu, metoda u podrazredu nadjačava metodu u superklasi. To se naziva nadjačavanje metode.
Primjer 1: Nadjačavanje metode
class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) )
Izlaz
Ja sam pas
U ovom primjeru, izradom objekta dog1 klase Dog možemo nazvati njegovu metodu printMessage () koja zatim izvršava display()
izraz.
Budući da display()
je definirana u obje klase, metoda potklase Dog nadjačava metodu superklase Animal. Stoga display()
se naziva podrazred.
Što ako se mora nazvati nadjačana metoda superklase?
Koristimo super.display()
ako display()
treba pozvati nadjačanu metodu superklase Životinja.
Primjer 2: super za pozivanje metode Superclass
class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( // this calls overriding method display(); // this calls overridden method super.display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) )
Izlaz
Ja sam pas Ja sam životinja
Evo kako funkcionira gornji program.
2. Pristupiti atributima superrazrede
Nadrazred i podrazred mogu imati atribute s istim imenom. super
Ključnu riječ koristimo za pristup atributu superklase.
Primjer 3: Pristup atributu superklase
class Animal ( protected String; ) class Dog extends Animal ( public String; public void printType() ( System.out.println("I am a " + type); System.out.println("I am an " + super.type); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printType(); ) )
Izlaz :
Ja sam sisavac Ja sam životinja
U ovom smo primjeru definirali isti tip polja instance i u superklasi Animal i u podklasi Dog.
Zatim smo stvorili objekt dog1 klase Dog. Zatim se printType()
metoda poziva pomoću ovog objekta.
Unutar printType()
funkcije,
- vrsta odnosi se na atribut potklase Pas.
- super.tip odnosi se na atribut superklase Životinja.
Dakle, System.out.println("I am a " + type);
otisci Ja sam sisavac. I, System.out.println("I am an " + super.type);
otisci Ja sam životinja.
3. Upotreba super () za pristup konstruktoru superklase
Kao što znamo, kada se kreira objekt klase, automatski se poziva njegov zadani konstruktor.
Da bismo eksplicitno pozvali konstruktor superklase iz konstruktora podklase, koristimo super()
. To je poseban oblik super
ključne riječi.
super()
može se koristiti samo unutar konstruktora potklase i mora biti prva izjava.
Primjer 4: Upotreba super ()
class Animal ( // default or no-arg constructor of class Animal Animal() ( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // default or no-arg constructor of class Dog Dog() ( // calling default constructor of the superclass super(); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) )
Izlaz
Ja sam životinja Ja sam pas
Ovdje, kada se kreira objekt dog1 klase Dog, on automatski poziva zadani ili no-arg konstruktor te klase.
Unutar konstruktora podklase, super()
naredba poziva konstruktor superklase i izvršava izraze unutar nje. Dakle, dobivamo rezultat Ja sam životinja.
Tok programa zatim se vraća natrag u konstruktor podklase i izvršava preostale izraze. Dakle, ja sam pas bit će tiskan.
Međutim, korištenje super()
nije obvezno. Čak i ako super()
se ne koristi u konstruktoru podklase, kompajler implicitno poziva zadani konstruktor superklase.
Pa, zašto koristiti suvišni kôd ako kompajler automatski poziva super ()?
Potrebno je ako parametarski konstruktor (konstruktor koji uzima argumente) superklase mora biti pozvan iz konstruktora potklase.
Parametrizirano super()
uvijek mora biti prva izjava u tijelu konstruktora podklase, u suprotnom dobivamo pogrešku kompilacije.
Primjer 5: Pozivanje parametarskog konstruktora pomoću super ()
class Animal ( // default or no-arg constructor Animal() ( System.out.println("I am an animal"); ) // parameterized constructor Animal(String type) ( System.out.println("Type: "+type); ) ) class Dog extends Animal ( // default constructor Dog() ( // calling parameterized constructor of the superclass super("Animal"); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) )
Izlaz
Tip: Životinja Ja sam pas
Prevoditelj može automatski pozvati konstruktor no-arg. Međutim, ne može pozvati parametrizirane konstruktore.
Ako se mora pozvati parametrizirani konstruktor, moramo ga izričito definirati u konstruktoru podklase.
Imajte na umu da smo u gornjem primjeru izričito nazvali parametrizirani konstruktor super("Animal")
. Prevoditelj u ovom slučaju ne poziva zadani konstruktor superklase.