Kurs Java

Klasy i programowanie obiektowe

No dobrze to teraz spójrzmy na klasy i obiekty od strony samego kodu. Zacznijmy od definicji. Programowanie obiektowe to takie, w którym do budowy programów używamy klas, na podstawie których powstają obiekty. Wiążą one ze sobą stan (dane przechowywane w polach) oraz działanie (zwykle procedury lub funkcje, a w Javie - metody). Obiektowy program komputerowy wyrażony jest jako zbiór takich obiektów, współpracujących ze sobą w celu wykonywania zadań.

No właśnie, tylko co to dokładnie oznaczają te klasy i obiekty w samej Javie?
  • Klasa – napisany przez programistę blok kodu zawierający pola o określonym typie danych oraz metody wykonujące określone operacje.
  • Obiekt – instancja tworzona przez działający program na podstawie napisanej wcześniej klasy.

Klasy w Javie

Można powiedzieć, że tworzymy wzorce (klasy), z których w trakcie działania programu tworzone są gotowe obiekty. Hmm... a jak to wygląda w praktyce? Weźmy sobie przykładowy szkielet klasy, niewypełniony kodem:
public class Item {
    
    // Definicje pól
    
    // Definicje konstruktorów
    
    // Definicje metod
} 
Jak widzicie, klasa ma swoją nazwę: Item. Nazwa klasy musi spełniać ograniczenia dotyczące identyfikatorów i zgodnie z konwencjami nazewniczymi powinna zaczynać się od dużej litery i być pisana w tzw. notacji PascalCase, czy UpperCamelCase.

W Javie powinna istnieć tylko jedna klasa główna w każdym pliku i musi być ona publiczna. To, że klasa jest publiczna, możemy stwierdzić po tym, że posiada modyfikator dostępu public.

Samą definicję umieszcza się w następujących po nazwie nawiasach klamrowych. Kod definicji (pomiędzy nawiasami klamrowymi) nazywa się ciałem klasy. W tym ciele klasy wprowadziliśmy trzy komentarze oznaczające kolejne sekcje klasy: pola, konstruktory, metody.

Pole, konstruktor, metoda?

Teraz rozłożymy te pojęcia na czynniki pierwsze:

  • Pole klasy (field) - określa własność (cechę), jaką będzie posiadał obiekt tej klasy. Może to być typ prosty (liczba, znak), ciąg znaków lub obiekt innej klasy. Polem może być także tablica lub lista złożona z dowolnego rodzaju wspomnianych elementów.
    public class Item {
        int id;
        String name;
        Category category;
    } 
    
  • Konstruktor - definiuje specjalną operację, która jak sama nazwa wskazuje, jest odpowiedzialna za skonstruowanie obiektu (za jego utworzenie).
    <modyfikator dostępu> <nazwa klasy> (<lista parametrów>)  {
            // Instrukcje wykonywane przez konstruktor
    }
    Przykładowy konstruktor:
    public class Item {
    
        int id;
        String name;
        Category category;
        
        public Item (int id, String name, Category category) {
            this.id = id;
            this.name = name;
            this.category = category;
        }    
    } 
    
      Na podstawie ogólnej definicji wyjaśnimy poszczególne określenia w powyższym zapisie:
    • public jest wspomnianym modyfikatorem dostępu. Konstruktor zdefiniowany ze słowem public jest dostępny zewsząd, a więc pozwala na stworzenie obiektu z dowolnego miejsca w projekcie. Tworzenie obiektów jak i modyfikatory dostępu są przez nas omawiane bardziej szczegółowo rozdziałach: Tworzenie własnych obiektów oraz Modyfikatory dostępu i niedostępowe.
    • Item jest nazwą klasy (nazwa użyta w konstruktorze zawsze musi być taka sama jak nazwa klasy).
    • int id, String name, Category category są przykładowymi parametrami konstruktora. Z racji tego, że nasz konstruktor ma kilka parametrów, nazywamy go konstruktorem wieloargumentowym albo wieloparametrowym. Może zdarzyć się tak, że konstruktor nie będzie posiadał w ogóle parametrów, wówczas nazwywamy go konstruktorem bezparametrowym, inaczej bezargumentowym. Przykładem takiego konstruktora jest konstruktor domyślny. Wygląda on tak:
      public Item() {
      
      }
      
      Domyślnego konstruktora nie musimy definiować, ponieważ Java zrobi to za nas. Natomiast jeśli zadekarujemy dowolny konstruktor (obojętnie jaki: bezargumentowy, jednoargumetowy, wieloargumentowy), to domyślny konstruktor nie zostanie utworzony. Więcej na temat konstruktorów przeczytacie już w kolejnym rozdziale - Tworzenie własnych obiektów.
    • Wiersz this.id = id i dwa kolejne wiersze, oznaczają czynności wykonywane przez konstruktor. W praktyce znaczy to tyle, że do pola klasy id przy pomocy operatora przypisania = (równa się) wstawiana jest wartość parametru. Zauważcie, że w podanym przykładzie parametry oraz pola konstruktora mają te same nazwy. Aby poprawnie przypisać wartości z parametrów do pól obiektu, używamy wskaźnika this. To słowo kluczowe, które wskazuje na bieżący obiekt. Gdybyśmy go pominęli, wówczas wartości parametrów zostałyby przypisane samym sobie, co w praktyce nic by nam nie dało. Pola obiektu nie miałyby ustawionych wartości.
  • Metoda - blok kodu służący do wykonywania określonych operacji na obiektach. Metoda może być wywoływana wielokrotnie z innych miejsc programu (w zależności od użytego modyfikatora dostępu). W odróżnieniu od funkcji (znanych z języków proceduralnych), metody nie tylko operują na obiektach (w swoim ciele), ale też same są wywoływane z innych obiektów. Wyjątkiem są metody statyczne, o których możecie przeczytać w rozdziale Metody statyczne.
    Schematyczna postać definicji metody jest następująca:
    <modyfikator dostępu> <typ zwracanej wartości> <nazwa metody> (<lista parametrów>)  {
            // Instrukcje wykonywane przez metodę
    }
    Przykładowe metody:
    public void setName(String name) {
        this.name = name;
    }
    
    public String getName() {
        return this.name;
    }
    
    • Modyfikator public mówi o tym, że dana metoda może być wywołana z dowolnej innej klasy w projekcie.
    • Typ zwracanej wartości (w naszym przypadku void lub String) określa jakiego typu jest wartość zwracana przez metodę. Zastosowanie określenia void oznacza, że metoda nie zwraca żadnej wartości.
    • Nazwy metod to w tym przypadku setName, getName. Pierwsza metoda będzie ustawiała wartość w stworzonym obiekcie, a druga umożliwi pobranie takiej wartości.
    • Parametr przekazywany do metody w nawiasie - String name. Tak jak w przypadku konstruktora może być wiele takich parametrów oddzielonych przecinkami.
    • Ostatnim fragmentem metody zwracającej jest słowo kluczowe return. Słowo return z angielskiego oznacza "zwróć". Cała komenda oznacza więc: zwróć wartość pola name przechowywanego w obiekcie.

      Appa Notka. Modyfikator dostępu występujący zarówno w przypadku konstruktorów, metod, jak i pól klas jest opcjonalny. Nie musimy zawsze go wpisywać. Jednak jeśli go ominiemy, wspomniane elementy będą miały ograniczoną widoczność w projekcie. W naszych przykładach dodajemy do metod i konstruktorów najczęściej modyfikator public, aby ułatwić Wam naukę podstaw języka, tak byście nie musieli co chwilę zastanawiać się jaki rodzaj modyfikatora powinien zostać użyty w danym miejscu. Na takie zabawy przyjdzie jeszcze czas. Najpierw warto poznać zasady działania języka, a dopiero później wprowadzać do niego ograniczenia, które wymagają wiedzy na odpowiednim poziomie - między innymi tej znajdującej się w rozdziale Modyfikatory dostępu i niedostępowe.
Zbierając w całość powyższą wiedzę, przykładowa, niewielka klasa wygląda tak:
public class Item {

    int id;
    String name;
    Category category;
    
    public Item(int id, String name, Category category) {
        this.id = id;
        this.name = name;
        this.category = category;
    }    
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getName() {
        return this.name;
    }    
}              
Pewnie nurtuje Was jeszcze, dlaczego właściwie klasa zawiera metody get i set tylko dla pola z nazwą? Czy czegoś tu nie brakuje? To jest celowy zabieg. Chcemy przez to pokazać, że klasa nie zawsze musi zawierać metody dedykowane każdemu z pól. Oczywiście to też nie znaczy, że powinniśmy tworzyć pola, do których później nie ma dostępu z poziomu metod. Po prostu na tym etapie nie chcemy jeszcze wchodzić w detale o zasadach używania setów i getów (tak zwanych getterów i setterów). Będziemy o tym mówić dokładniej w niedalekiej przyszłości, w osobnym rozdziale.
Linki
https://docs.oracle.com/javase/tutorial/java/concepts/class.html
http://edu.pjwstk.edu.pl/wyklady/ppj/scb/DefKlas/DefKlas.html
Masz pytanie dotyczące tego rozdziału? Zadaj je nam!
Masz pytanie dotyczące prezentowanego materiału?
Coś jest dla Ciebie niejasne i Twoje wątpliwości przeszkadzają Ci w pełnym zrozumieniu treści?
Napisz do nas maila, a my chętnie znajdziemy odpowiednie rozwiązanie.
Najciekawsze pytania wraz z odpowiedziami będziemy publikować pod rozdziałem.
Nie czekaj. Naucz się programować jeszcze lepiej.
kursjava@javappa.com

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .