Jaka klasa taki kod!

Co to znaczy, że Java jest obiektowa?

Java jest językiem obiektowym. To znaczy ni mniej ni więcej tyle, że wszystko w Javie toczy się wokół obiektów. Tworząc program w języku obiektowym, tworzymy zespół obiektów, które opiszą logikę “biznesową”. Obiekty tworzące program komunikują się między sobą rozwiązując jakieś zadania.
Aby napisać poprawnie program w języku obiektowym należy posiąść umiejętności pisania obiektów oraz modelowania nimi rzeczywistości opisywanej w programie. Zacznijmy od tego czym jest klasa.

Klasa

Aby utworzyć obiekt potrzebujemy do tego jakiegoś mechanizmu. Mechanizm ma nam zapewnić powtarzalność tworzenia obiektów. Np jeżeli program ma zapisywać dane użytkowników, a obiektem jest pojedynczy użytkownik, to chcemy mieć możliwość tworzenia więcej niż jednego użytkownika używając jednego szablonu.
Wszystko powyższe zapewnia nam klasa. (klasa w dokumentacji Oracle)

Klasa jest jak szablon w przychodni zdrowia, do którego wpisuje się dane pacjenta. Każdy z szablon (pusty dokument) jest sformatowany. Ma takie same elementy do wypełnienia, (np. imię, nazwisko, datę urodzenia itd). Obiekt pacjenta powstaje po wypełnieniu przez pielęgniarkę pustego szablonu i włożeniu go do teczki.

Klasa jest takim szablonem. W klasie definiujemy tzw pola określające nam “stan” obiektu (jego cechy). Klasa ponadto zawiera metody. Są to elementy programu, które opisują, jakie zadania obiekt stworzony przy pomocy klasy, będzie mógł wykonywać. Ostatnim elementem klasy jest konstruktor. Konstruktor jest mechanizmem który po wywołaniu w programie tworzy obiekt używając klasy. Konstruktor potrzebuje wiedzieć, które z pól (elementy stanu obiektu) są wymagane aby obiekt mógł być utworzony. W javie może to być jedno z pól, wszystkie, bądź żadne!

Na przykładzie karty pacjenta. Aby ją utworzyć w szablonie musi znaleźć się imię, nazwisko, adres, nr ubezpieczenia, data urodzenia. Dodatkowo mamy pola związane z opisami wizyt pacjenta, jego szczepień itd. Jednak mogą one pozostać niewypełnione (przynajmniej do czasu pierwszej wizyty w przychodni). Podobnie jest z tworzeniem obiektu w Javie.

Konstruktor domyślny

Nie przystającym do sytuacji jest konstruktor, który nie potrzebuje ani jednego pola do utworzenia obiektu. Taki konstruktor nazywamy “domyślnym”. Dlatego domyślnym ponieważ, gdy nie napiszemy, żadnego innego konstruktora, Java domyślnie wie, że taki konstruktor istnieje. Do czego taki konstruktor jest potrzebny? Bardzo trywialny przykład to klasa która jest nazwijmy to “kontenerem”. Zawiera listy różnych elementów (pola klasy). Jednak przy pierwszej inicjalizacji listy są puste i będą zapełniane w trakcie działania programu poprzez użycie odpowiednich metod klasy.

Oczywiście to taki przykład, wymyślony na potrzeby artykułu. Klasy domyślne potrzebne są jeszcze z innych powodów, dużo bardziej skomplikowanych. Jest to temat dość zaawansowany i wykracza poza ramy tego tekstu.

Tworzenie klasy

Klasę w Javie tworzymy wpisując słowo class NazwaKlasy oraz nawiasy klamrowe {}. Między nawiasami klamrowymi, znajduje się definicja (ciało) klasy, czyli jej pola, metody i konstruktory.

przykład:

public class Customer {
    long id;
    String name;
    String dob;

    public Customer (String name, String dob) {
        this.name = name;
        this.dob = dob;
    }

    public String getName() {
        return this.name;
    }
}

Mamy tu klasę Customer zawierającą 3 pola, przy czym tylko dwa z nich są niezbędne do utworzenia obiektu. Dodatkowo klasa zawiera metodę getName(), która zwraca wartość pola name.

Konstruktor wskazuje jakiego typu pola przyjmuje oraz w swoim “ciele” (tzn wewnątrz nawiasu klamrowego), przekazuje podane informacje do pól. Często wśród bardzo początkujących widzę dezorientację przy this.name = name. Otóż this.name jest wskazaniem na pole o nazwie name. natomiast name jest nazwą parametru przekazywanego w konstruktorze. 

Często się tak zapisuje, jednak równie dobrze można by napisać:

public Customer(String firstName, String birthDate) {
    this.name = firstName;
    this.dob = birthDate;
}

Mając taki szablon możemy tworzyć dowolną liczbę obiektów typu Customer

Klasę można rozszerzać o dodatkowe funkcjonalności przy użyciu interfejsów (o których już pisałem na blogu).

Tworzenie obiektu

To skoro już mamy “szablon” to jak z niego utworzyć obiekt? To bardzo proste! Musimy wywołać konstruktor, podać wymagane dane, oraz zapisać nowy obiekt pod wybraną nazwą ze wskazaniem typu. Wywołanie konstruktora odbywa się poprzez użycie słowa new  oraz podanie nazwy konstruktora wraz potrzebnymi danymi.

Customer customerA = new Customer(“Jan”, “12/04/1975”);
Customer customerB = new Customer(“Anna”, “22/03/1989”);

Co tak naprawdę dzieje się w trakcie tworzenia obiektu?Nazwa obiektu na przykład jak z powyższego przykładu customerA jest przekazana do pamięci podręcznej (zwanej stack) jako referencja. Obiekt zostaje zaalokowany pod wyznaczonym adresem w pamięci (na ten adres wskazuje nasza referencja, czyli nazwa) zwanej heap, czyli sterty, gdzie zostanie do czasu, w którym nie zostanie uznany za zbędny dla działania programu i usunięty. (Patrz artykuł o przekazywaniu parametrów w Javie, na blogu).

O innych aspektach klasy i obiektu, a w tym między innymi o hashCode i metodzie toString() już w za tydzień!!

Jest jeszcze wiele innych metod tworzenia obiektu w Javie. Jednak każda wprost, bądź pośrednio korzysta z konstruktora. O tym w kolejnych wpisach na blogu Lekcji Kodu.

1 myśl na temat “Jaka klasa taki kod!

  1. Pingback: Po co komu hashCode i equals? - { Lekcje Kodu }

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *