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:
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.
-
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:
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:
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:
-
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:
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.
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
Czy informacje, które otrzymałeś, były pomocne?
Jeśli tak, zapraszam Cię do podarowania mi kawy.
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.