Kurs Java

Metody statyczne

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ść miedzy 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:
public class ItemDataPrinter {

    static void printItemData (Item item) {    
        System.out.println(item.getName());
    }
} 
Do uruchomienia takiej metody nie potrzebujemy tworzyć obiektu. Wystarczy odwołać się bezpośrednio do klasy:
public class Start {

    public static void main(String[] args) {

        Item item = new Item("Appa Item no. 1");
        ItemDataPrinter.printItemData(item);
    }
}
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).

Ciekawostka. 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 jakimkolwiek 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 .

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:
public class Start {

    public static void main(String[] args) {

        this.printItemData();
    }
    
    public void printItemData() {
        System.out.println("Item no. 1");
    }
}
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ę, żę 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):
public class Start {

    public static void main(String[] args) {

    	Start start = new Start();
    	start.printItemData();
    }
    
    public void printItemData() {
    	System.out.println("Item no. 1");
    }
}
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 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:
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 .