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