Wszystkie metody, które pokazaliśmy do tej pory, operują na obiektach i z własnego doświadczenia możemy powiedzieć, że
prawdopodobnie 90% kodu napiszecie, korzystając właśnie z nich. Natomiast są pewne sytuacje, w których przydatne staje się
wykorzystanie metody statycznej, czyli takiej, do użycia której nie jest wymagane tworzenie obiektu.
Paradoksalnie rozdział ten umieściliśmy w części obiektowej, gdyż po pierwsze chcemy pokazać pewną zależność między metodami statycznymi a obiektowymi,
a po drugie według nas lepiej jest najpierw zapoznać się z tym, jak działają metody obiektowe, a dopiero potem dowiedzieć się czym różnią się od nich metody statyczne.
Metody te nie powinny być nadużywane, o czym będziemy pisać nieco niżej.
Najczęściej metody statyczne są wykorzystywane, jeśli chcemy wykonać ten sam algorytm w wielu miejscach w projekcie.
Na przykład możemy stworzyć metodę, która będzie przyjmować obiekt
Item i na jego podstawie
wydrukuje nam nazwę itema na konsolę.
Ważne jest, że ten algorytm nie powinien zmieniać stanu obiektów, na których operuje.
Jeśli stan ten jest zmieniany (na przykład zmieniana jest nazwa obiektu albo jego id, czy też inne dane zapisane w jego polach),
wówczas nie powinniśmy korzystać z metody statycznej.
Jak wygląda metoda statyczna w Javie
Jak wygląda metoda statyczna?
Wystarczy dodać słowo
static przed typem zwracanej wartości:
Do uruchomienia takiej metody nie potrzebujemy tworzyć obiektu. Wystarczy odwołać się
bezpośrednio do klasy:
Takie metody są bardzo proste w użyciu i dla początkujących programistów jest to niezwykle kuszące, aby używać ich, gdzie tylko popadnie.
To jest jednak fatalny pomysł, który bardzo szybko będzie miał swoje konsekwencje. Raz, że w tym momencie nie piszemy obiektowo, co jest w ogóle zaprzeczeniem logiki użycia
języka obiektowego, a dwa, że taki sposób pisania kodu nie pozwala nam wykorzystać potencjału takiego języka.
Wszystko co dobre w programowaniu obiektowym sprowadza się w dużej mierze do tworzenia obiektów i przechowywania w nich bieżącego stanu.
Następnie takie obiekty przekazujemy między sobą i wykorzystujemy ich zdolność do przechowywania tego stanu. W ten sposób możemy transportować
ładnie opakowane dane (jak paczki dostarczane przez kurierów) pomiędzy kolejnymi fragmentami kodu w programie, zmieniać je i wykorzystywać dalej w zmienionej formie.
Oczywiście to nie znaczy też, że wykorzystanie metod statycznych w Javie jest złem koniecznym. Jeden przykład użycia (bardzo prosty) już pokazaliśmy, a trzeba wiedzieć, że zdarzają się też sytuacje,
w których wykorzystanie takich metod staje się wręcz nieuniknione. To jednak związane jest z pojęciami, którymi na tym etapie nie potrzebujemy się zajmować (dotyczy to wzorców projektowych).
Appa Notka. Pewnie zauważyliście, że słowo static jest zawsze wstawiane przed metodą main.
Czy to oznacza, że rozpoczęcie programu nie jest związane od razu z żadnym obiektem? Dokładnie tak! Na samym początku mamy tylko klasę Start
i nie ma tu mowy o żadnym obiekcie. Dopiero w ramach tej metody możemy użyć naszego pierwszego new, aby stworzyć nasz pierwszy obiekt!
Na takim obiekcie możemy uruchamiać zdefiniowane w jego klasie metody oraz taki obiekt może tworzyć kolejne obiekty. I tak cały czas tworzymy i tworzymy określoną sieć obiektów,
które budują nam program. Oczywiście wszystko pod kontrolą pewnych zasad, o których cały czas piszemy w naszym kursie
.
Szukasz dobrego kursu nowej Javy? Mamy dla Ciebie kurs oparty na 150 przykładach.
Kurs nowej Javy składa się z kursu Javy 8 oraz Javy od wersji 9 do 17.
Metoda obiektowa w metodzie statycznej
Teraz uwaga. Załóżmy, że przyszedł nam do głowy "szatański" pomysł i chcielibyśmy uruchomić metodę obiektową bezpośrednio z metody statycznej. Próbujemy zatem
uruchomić metodę
printItemData (nie jest statyczna tylko obiektowa) w ciele
metody statycznej, na przykład w ciele metody
main:
Czy coś takiego może się udać? Otóż nie. Taki kod nawet się nie skompiluje! Słowo kluczowe
this zawsze wskazuje na obiekt,
a przecież nigdzie wcześniej nie stworzyliśmy obiektu klasy
Start.
Tutaj dochodzimy do sedna sprawy.
Nie możemy dostać się z poziomu metody nieobiektowej do metody dostępnej jedynie z poziomu obiektu.
No dobrze, ale czy to znaczy, że taka metoda obiektowa (niestatyczna) stworzona w klasie, w której mamy tylko jedną metodę statyczną (w tym przypadku
main) w ogóle do niczego nam się nie przyda?
Nie ma żadnej możliwości, aby uruchomić ją z poziomu metody statycznej? Okazuje się, że to ciągle jest możliwe,
ale aby to zrobić musimy zastosować się do zasad programowania obiektowego.
W takiej sytuacji musimy najpierw stworzyć obiekt klasy
Start, a następnie na obiekcie tej klasy użyć metody
printItemData (mamy obiekt klasy
Start, więc uzyskujemy
dostęp do metody w ramach obiektu):
Przy okazji zauważamy tu dwie rzeczy. Po pierwsze obiekt klasy
Start tworzymy normalnie, tak jak tworzyliśmy tutaj obiekty klasy
Item czy
ItemService. W końcu klasa
Start to pełnoprawna
klasa Java i nie ma to znaczenia, że posiada ona metodę
main inicjującą nasz program.
Po drugie widzimy, że następuje tu tworzenie obiektu klasy bezpośrednio z tejże klasy (tworzymy obiekt klasy
Start, będąc w jednej z metod klasy
Start).
Może się to wydawać mało naturalne, ale takie coś jest jak najbardziej możliwe. Jak sami zobaczycie podczas omawiania kolejnych tematów, potrafi być nawet bardzo użyteczne (choć nie jest to stosowane nagminnie).
Na tę chwilę wystarczy, że będziecie wiedzieć, iż taka możliwość istnieje.
Linki
https://www.w3schools.com/java/java_methods.asp
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.