Java dla Testerów 12. Konstruktory

Po lekcji dotyczącej klasy, pól i obiektów kontynuujemy tą tematykę i pokażę Ci czym są konstruktory. Konstruktory bezpośrednio łączą się z pojęciem klasy, ponieważ to za pomocą konstruktorów możemy tworzyć obiekty danej klasy.

Konstruktory są takimi metodami, które umożliwiają tworzenie obiektów danej klasy. Konstruktory definiujemy w klasie, której obiekty chcemy tworzyć, a jego budowa może wyglądać np. tak:

public class PlanetarySystem {    

    public PlanetarySystem() {

    }
}

To jest najprostszy konstruktor – podajemy modyfikator dostępu (albo nie, ale o modyfikatorach jeszcze sobie powiemy)  i następnie nazwę klasy i zwykłe nawiasy, a po nich klamrowe jak przy metodach. Ten konstruktor nie robi nic poza stworzeniem obiektu klasy PlanetarySystem. Tak też zresztą wygląda domyślny konstruktor, czyli konstruktor jaki ma klasa, dla której nie stworzymy konstruktora.  Wywołanie takiego konstruktora jest super proste:

public class PlanetarySystemTests {

    @Test
    public void firstTest(){
        PlanetarySystem planetarySystem = new PlanetarySystem();        
    }
}

Czyli używamy słówka „new”, a następnie wpisujemy nazwę klasy i nawiasy. Jeżeli chcemy później użyć tak stworzonego obiektu, to dobrze też stworzyć wcześniej zmienną, która będzie przechowywała referencję do tego obiektu (planetarySystem).

A co jeżeli będziemy chcieli stworzyć obiekt typu PlanetarySystem, który będzie przechowywał informacje o danym systemie planetarnym i (co gorsza!) będziemy chcieli te informacje podać w momencie tworzenia obiektu? A nie ma problemu, w takim wypadku trzeba będzie stworzyć konstruktor z parametrami. Może on wyglądać np. tak:

public class PlanetarySystem {
    private String starName;
    private String starType;
    private int numberOfPlanets;

    public PlanetarySystem(String starName, String starType, int numberOfPlanets) {
        this.starName = starName;
        this.starType = starType;
        this.numberOfPlanets = numberOfPlanets;
    }
}

Tutaj już lepiej widać podobieństwo konstruktora do metody – podobnie jak w metodach, w konstruktorach możemy używać parametrów. W tym przykładzie zadeklarowaliśmy w ciele klasy trzy pola, a w konstruktorze przekazujemy im jakieś wartości. Czyli przy każdym wywołaniu konstruktora z podanymi parametrami stworzymy obiekt klasy PlanetarySystem o określonej liczbie planet oraz gwieździe o jakiejś nazwie i typie. Pamiętaj jednak, że jedynie obiekt tej klasy będzie zawierał takie informacje – żaden kolejny nowy obiekt tej klasy ani żaden poprzednio stworzony, nie będzie automagicznie przejmował tych informacji.

Używamy tutaj słówka this, które służy nam do tego, żeby powiedzieć o które starName, starType oraz numerOfPlanets nam chodzi. Zwróć uwagę, że parametry metody mają takie same nazwy jak pola klasy. Żeby więc użyć w konstruktorze starName, które jest polem tej klasy należy użyć słówka this i dopiero po kropce wstawić nazwę pola. W innym wypadku wzięty pod uwagę zostanie parametr.

A czy w konstruktorach można używać metod. A pewnie, weźmy taki przykład:

public class PlanetarySystem {
    private String starName;
    private String starType;
    private int numberOfPlanets;

    public PlanetarySystem(String starName, String starType, int numberOfPlanets) {
        this.starName = starName;
        this.starType = starType;
        this.numberOfPlanets = numberOfPlanets;

        System.out.println("Name of the star is: " + starName +
                ", star type is " + starType +
                 ", number of planets is " + numberOfPlanets);
    }
}

Tutaj używamy metody println, która pozwala na wypisanie w konsoli tekstu, w tym wypadku jest to informacja o tym jakie parametry zostały przekazane w konstruktorze. Efekt będzie taki, że ta metoda zostanie wywołana za każdym razem, gdy będziemy tworzyć obiekt za pomocą tego konstruktora.

Każda klasa może mieć kilka konstruktorów. Na koniec warto również pamiętać, że w momencie, gdy stworzymy jakiś konstruktor w klasie, to nie będziemy już mogli użyć domyślnego. Jeżeli będziemy chcieli mieć taki najprostszy, bezparametrowy konstruktor, będziemy go sobie musieli stworzyć.