Java dla Testerów 19. Słowo kluczowe super

W tej lekcji pojawi się słowo kluczowe super. Pokażę Ci czym to jest, a na końcu zobaczysz także praktyczne użycie w testach Selenium.

Słowo kluczowe super: linki i materiały

W poprzedniej lekcji poznaliśmy słowo kluczowe this. W tej także się ono pojawi więc jeżeli nie widziałeś/aś poprzedniej lekcji to zobaczysz ją tutaj. Przyda Ci się ta wiedza przed przejściem do bieżącej lekcji.

Konstruktor

Pierwszym użyciem słowa kluczowego super jest odwołanie do konstruktora klasy nadrzędnej. W naszym przykładzie mamy klasę Planet, która dziedziczy po klasie AstronomicalObject. W tej drugiej klasie znajduje się prosty konstruktor, który pozwala na stworzenie obiektu podając tylko jeden parametr, a jest nim nazwa obiektu astronomicznego.

Jeżeli chcemy móc stworzyć obiekt klasy Planet również korzystając z takiego konstruktora, to znaczy podając jedynie nazwę obiektu astronomicznego (w tym wypadku nazwę planety) to wystarczy w konstruktorze klasy Planet użyć słówka super i za jego pomocą wywołać konstruktor klasy nadrzędnej. Pamiętaj, że konstruktor w klasie dziedziczącej musi przyjmować i przekazywać parametr znajdujący się w konstruktorze klasy nadrzędnej. W naszym wypadku jest to nazwa obiektu.

public class AstronomicalObject {
    private int orbitalPeriodInDays;
    private float radius;
    protected String name;

    public AstronomicalObject(String name){
        this.name = name;
    }    
}
public class Planet extends AstronomicalObject {
    private int numberOfMoons;
    private int mass;
    private float rotationPeriodInDays;
    private boolean hasRings;
    private String name;

    public Planet(String name){
        super(name);
    }
}

Użycie super nie ogranicza się tylko do tak prostego przykładu. Jeżeli nasz konstruktor w klasie dziedziczącej ma robić jeszcze coś ekstra, to może. Pamiętaj tylko, że super musi iść na początku.

public class AstronomicalObject {
    private int orbitalPeriodInDays;
    private float radius;
    protected String name;

    public AstronomicalObject(String name){
        this.name = name;
    }

    public AstronomicalObject(String name, int orbitalPeriodInDays, float radius){
        this.name = name;
        this.orbitalPeriodInDays = orbitalPeriodInDays;
        this.radius = radius;
    }
}
public class Planet extends AstronomicalObject {
    private int numberOfMoons;
    private int mass;
    private float rotationPeriodInDays;
    private boolean hasRings;
    private String name;

    public Planet(String name){
        super(name);
    }

    public Planet(String name, int orbitalPeriodInDays, float radius, boolean hasRings){
        super(name, orbitalPeriodInDays, radius);
        this.hasRings = hasRings;
    } 
}

Metody i pola klasy

Słówka super możemy także użyć, gdy chcemy się odwołać do metody ale pola klasy nadrzędnej. Możesz chcieć spytać: po co? Przecież skoro dziedziczymy po klasie nadrzędnej, to powinniśmy mieć normalnie możliwość użycia metod i pól tej klasy (oczywiście jeżeli modyfikatory dostępu nam na to pozwalają).

No i racja, ale co w sytuacji, gdy w obu klasach znajduje się jakaś metoda albo pole o tej samej nazwie? Wtedy właśnie przez słówko super możemy powiedzieć, że chcemy użyć metody z klasy nadrzędnej.

package Super;

public class AstronomicalObject {
    private int orbitalPeriodInDays;
    private float radius;
    protected String name;

    public AstronomicalObject(String name){
        this.name = name;
    }

    public AstronomicalObject(String name, int orbitalPeriodInDays, float radius){
        this.name = name;
        this.orbitalPeriodInDays = orbitalPeriodInDays;
        this.radius = radius;
    }
    public AstronomicalObject(){}

    public int getOrbitalPeriod() {
        return orbitalPeriodInDays;
    }
}
package Super;

public class Planet extends AstronomicalObject {
    private int numberOfMoons;
    private int mass;
    private float rotationPeriodInDays;
    private boolean hasRings;
    private String name;

    public Planet(String name){
        super(name);
    }

    public Planet(String name, int orbitalPeriodInDays, float radius, boolean hasRings){
        super(name, orbitalPeriodInDays, radius);
        this.hasRings = hasRings;
    }
    public Planet(int mass){
        this.mass = mass;
    }
    @Override
    public int getOrbitalPeriod() {
        return super.getOrbitalPeriod()/365;
    }
    public String getName(){
        return super.name;
    }
}