Java - Ključna riječ super


Ključna riječ super u Javi se koristi u podklasama za pristup članovima superklase (atributi, konstruktori i metode). Prije nego što naučimo o ključnoj riječi super, pobrinite se da znate o nasljeđivanju u Java.



Upotreba ključne riječi super

  1. Poziva metode superklase koje su nadjačane u podklasi.
  2. Pristup atributima (poljima) superklase, ako i superklasa i podklasa imaju atribute s istim imenom.
  3. Eksplicitno pozovanje superklase no-arg (zadano) ili parametarskog konstruktora iz konstruktora podklase.

Hajde sada da razjasnimo svaku od ovih upotreba.



Pristup nadjačanim metodama superklase

Ako su metode s istim imenom definisane i u superklasi i u podklasi, metoda u podklasi nadjačava metodu u superklasi. To se naziva nadjačavanje metode.


Primjer 1: Nadjačavanje metode

class Animal {

  // Nadjačana (overridden) metoda
  public void display(){
    System.out.println("Ja sam životinja");
  }
}

class Dog extends Animal {

  // Nadjačana (overridden) metoda
  @Override
  public void display(){
    System.out.println("Ja sam pas");
  }

  public void printMessage(){
    display();
  }
}

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

U ovom primjeru, izradom objekta dog1 klase Dog, možemo pozvati njegovu metodu printMessage() koja zatim izvršava izraz display(). Budući da je izraz display() definisan u obe klase, metoda podklase Dog nadjačava metodu superklase Animal. Zbog toga se poziva izraz display() potklase.



Šta ako se mora pozvati nadjačana metoda superklase? Koristimo metodu super.display() ako treba pozvati prikaz nadjačane display() metode superklase Animal.


Primjer 2: Ključna riječ super za pozivanje metode Superclass

class Animal {

  // Nadjačana (overridden) metoda
  public void display(){
    System.out.println("Ja sam životinja");
  }
}

class Dog extends Animal {

  // Nadjačana (overridden) metoda
  @Override
  public void display(){
    System.out.println("Ja sam pas");
  }

  public void printMessage(){

    // Pozivanje nadjačane (overriding) metode
    display();

    // Pozivanje nadjačane (overriding) metode
    super.display();
  }
}

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

Evo kako funkcioniše gornji program.





Pristupanje atributima superklase

Superklasa i podklasa mogu imati atribute s istim imenom. Koristimo ključnu riječ super za pristup atributu superklase.


Primjer 3: Pristup atributu superklase

class Animal {
  protected String type="životinja";
}

class Dog extends Animal {
  public String type="sisar";

  public void printType() {
    System.out.println("Ja sam " + type);
    System.out.println("Ja sam " + super.type);
  }
}

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

U ovom smo primjeru definisali isti tip polja instance i u superklasi Animal i u podklasi Dog. Zatim smo kreirali objekt dog1 klase Dog. Zatim se pomoću ovog objekta poziva metoda printType(). Unutar funkcije printType():

  • tip (type) - se odnosi na atribut podklase Dog.
  • super.type - odnosi se na atribut superklase Animal.

Dakle, System.out.println ("ja sam" + type); ispisuje Ja sam sisar, a System.out.println ("Ja sam" + super.type); ispisuje Ja sam životinja.



Upotreba naredbe 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 naredbu super(). To je poseban oblik ključne riječi super. Ključna riječ super() se može koristiti samo unutar konstruktora podklase i mora biti prva izjava.


Primjer 4: Upotreba naredbe super()

class Animal {

  // Zadani ili ne-arg konstruktor klase Animal
  Animal() {
    System.out.println("Ja sam životinja");
  }
}

class Dog extends Animal {

  // Zadani ili ne-arg konstruktor klase Dog
  Dog() {

    // Pozivanje zadanog konstruktora superklase
    super();

    System.out.println("Ja sam pas");
  }
}

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

Kada se kreira objekt dog1 klase Dog, on automatski poziva zadani ili no-arg konstruktor te klase. Unutar konstruktora podklase, naredba super() poziva konstruktor superklase i izvršava izraze unutar nje. Dakle, dobili smo rezultat Ja sam životinja.


Tok programa se zatim vraća nazad u konstruktor podklase i izvršava preostale izraze. Tako će biti ispisan. Međutim, upotreba ključne riječi super() nije obavezna. Čak i ako se ključna riječ super() ne koristi u konstruktoru podklase, kompajler implicitno poziva zadani konstruktor superklase. Pa, zašto koristiti suvišni kod ako je kompajler automatski poziva? Potrebno je ako parametarski konstruktor (konstruktor koji uzima argumente) superklase mora biti pozvan iz konstruktora podklase. Parametrizovana naredba super() uvijek mora biti prva izjava u tijelu konstruktora podklase, u suprotnom dobijamo grešku.


Primjer 5: Konstruktor parametarskog poziva pomoću metode super()

class Animal {

  // Zadani ili ne-arg konstruktor
  Animal() {
    System.out.println("Ja sam životinja");
  }

  // parametrizovani konstruktor
  Animal(String type) {
    System.out.println("Tip: "+type);
  }
}

class Dog extends Animal {

  // Difoltni (default) konstruktor
  Dog() {

    // Pozivanje parametrizovanog konstruktora superklase
    super("Animal");

    System.out.println("Ja sam pas");
  }
}

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

Kompajler može automatski pozvati konstruktor no-arg. Međutim, ne može pozvati parametrizovane konstruktore. Ako se mora pozvati parametrizovani konstruktor, moramo ga izričito definisati u konstruktoru podklase.



Imajte na umu da smo u gornjem primjeru izričito parametarski konstruktor nazvali super ("Animal"). Prevoditelj u ovom slučaju ne poziva zadani konstruktor superklase.