Java - super ključna riječ


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

  1. Pozvati metode superklase koja je nadjačana u podklasi.
  2. Za pristup atributima (poljima) superklase ako i superklasa i podklasa imaju atribute s istim imenom.
  3. Da eksplicitno pozovete superklasu no-arg (zadano) ili parametarski konstruktor 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 super.display() ako treba pozvati prikaz nadjačane metode display() 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 funkcionira 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. I, System.out.println ("Ja sam" + super.type); ispisuje Ja sam životinja.



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. Ključna riječ super() se može koristiti samo unutar konstruktora podklase i mora biti prva izjava.


Primjer 4: Upotreba 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();
  }
}

Ovdje, 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 kompajler automatski poziva super()? Potrebno je ako parametarski konstruktor (konstruktor koji uzima argumente) superklase mora biti pozvan iz konstruktora podklase. Parametrizirani super() uvijek mora biti prva izjava u tijelu konstruktora podklase, u suprotnom dobivamo grešku kompilacije.


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

class Animal {

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

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

class Dog extends Animal {

  // difoltni (default) konstruktor
  Dog() {

    // pozivanje parametriziranog 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 parametrizirane konstruktore. Ako se mora pozvati parametrizirani 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.