No siema!
Witam Cię w kolejnej części cyklu Java Battle, w którym w rzeczowy sposób porównuję różne elementy i funkcjonalności Javy. W tej rundzie Java Battle poruszymy temat statycznych i niestatycznych funkcji oraz zmiennych.
W języku Java rozróżniamy funkcje i metody na statyczne, związane bezpośrednio z klasą, oraz niestatyczne, operujące na instancjach obiektów. To podział stanowi istotną koncepcję, którą przybliżę w niniejszym wpisie. Lecimy!
Static variables / methods( )
Static variables
- Deklarowane przy użyciu modyfikatora
static
- Są to ogólnodostępne zmienne, które mogą służą do starowania konkretymi operacjami (np. zliczania operacji) lub korzystania ze stałych wartości (np. liczba PI). Generalnie używane są w przypadkach, kiedy nie chcemy, aby ktoś zmianił ich wartość w przyszłości
- Przykład 1: stałe wartości
// konwencja sugeruje, aby nazwy stałych zmiennych pisać z dużych liter // można dodatkowo uzyć operator final static final double PI = 3.14; static final int WEEK_DAYS = 7;
class Cat{ String name; static int counter; // statyczna zmienna zliczająca ilość nowych obiektów public Cat(String name){ this.name = name; counter++; } Cat cat1 = new Cat("Tom"); Cat cat2 = new Cat("Ron"); // zmienna statyczna counter jest zwiększana za każdym razem, gdy powstanie nowy obiekt // jest tylko jedna kopia statycznej zmiennej counter w klasie, co oznacza, że: // jej wartość jest niezależna od obiektu (dla wszyskich obiektów taka sama) // gdyby zmienna counter byłaby niestatyczna, to stałaby się zmienną instancji // w takiej sytuacji, każdy nowy obiekt posiadałby zmienną counter o wartości = 1 }
- Zmienne statyczne dostępne są z poziomu całej klasy, w której się znajdują
- Podczas wykonywania kodu zmienne statyczne są inicializowane zawsze w pierwszej kolejności (przed utworzeniem obiektów), niezależnie od kolejności linii, w której zostały zdeklarowane
Static methods( )
- Deklarowane również przy użyciu modyfikatora
static
- Podobnie jak w przypadku zmiennej statatycznej, również metoda statyczna nie jest powiązana z konkretnym obiektem, a jedynie z klasą, w której się znajduje
- Nie musi być wywoływana na obiektach. Aby wywołać metodę statyczną wystarczy odnieść się do klasy, w ktorej metoda się znajduje (poprzez operator
kropki
)
public class Car { public static void drive() { System.out.println("Car is driftig"); } public static void main(String[] args) { Car.drive(); // Wywołanie metody statycznej wykorzystując nazwę klasy Car } }
- Metoda statyczna jest zawsze dostępna z poziomu klasy, w której występuje. Aby wywołać taką metodę w innej klasie (na zewnąrz) należy użyć odwołania do klasy, w której metoda statyczna się znajduje
- Przykłady metod statycznych, których prawdopodobnie używasz w swoich programach
System.out.println("")
- statyczna metoda klasySystem
public static void main(String [] args)
- słynna metodamain()
min(int a, int b)
- metoda klasy Math zwracająca mniejszą spośród dwóch przekazanych liczb
- W metodzie statycznej nie można wywoływać zmiennych i metod niestatycznych. Dobrze obrazuje to przykład metody statycznej
main()
, w której nie możesz ot tak wywołać żadnej zmiennej lub metody niestatycznej. Aby to zrobić musisz najpierw utworzyć instację (obiekt) klasy, z którą niestatyczna zmienna jest powiązana, a następnie na tym obiekcie wywołać zmienną
public class Animals{ String species; public void eat(){ } public static void main (){ System.out.println("An animal is " + species); // ERROR: nie można użyć zmiennej instacji w metodzie statycznej bez Obiektu eat() // ERROR: nie można wywołać metody niestatycznej w metodzie statycznej bez Obiektu }
- Metody statyczne zawsze mają dostęp do zmiennych statycznych
💡CIEKAWOSTKA (METASPACE)
W
Javie
"elementy statyczne" należą do klasy, a nie do jej konkretnych instancji (obiektów). Te elementy statyczne, wraz z definicjami klas, przechowywane są w obszarze pamięci zwanym Metaspace
, który różni się od miejsca, w którym przechowywane są zwykłe obiekty.Metaspace nie jest ani częścią
sterty (heap)
, ani stosu (stack)
. Jest to osobny obszar pamięci wewnątrz maszyny wirtualnej Javy (JVM)
, który służy do przechowywania metadanych związanych z klasami i ich strukturą. Pamięć stosu jest wykorzystywana do przechowywania lokalnych zmiennych i wywołań funkcji, natomiast sterta służy do przechowywania obiektów w trakcie działania programu.Non-static variables / methods( )
Non-static variables
- Nie używa sięspecjalnego modyfikatora do oznaczenia zmiennej jako niestatycznej (można ewetualanie użyć dodatkowych modyfikatorów dostępu np.
public
lubprivate
wtedy, kiedy potrzebujemy wyszczególnić dostępność tych zmiennych)
- Zmienne/ metody niestatyczne to inaczej zmienne / metody instancji
- Związane są z intancjamii klasy, w której się znajdują
- Aby odnieść się do niestatycznej zmiennej lub metody, należy użyć obiektu
public class Dog { String name; // niestatyczna zmienna void bark() { // niestatyczna metoda System.out.println(""Woof!"); } public static void main(String[] args) { Dog dog = new Dog(): // tworzymy obiekt dog.name = "Ruffy" // odniesienie do zmiennej niestatycznej i przypisanie wartości dog.bark(); // wywołanie metody niestatycznej na obiekcie } }
- Generalnie dostęp do zmiennych oraz metod niestatycznych uzyskujemy poprzez instncjonowanie klasy, w której owe zmienne się znajdują
The winer is….
Ciężko jednoznacznie stwierdzić, kto może wygrac tą walkę. Wśród młodych adeptów programowania używanie statica może wydawać się bardzo kuszące, chociażby z łatwości wywołania metod i zmiennych statycznych odnosząc się jedynie do nazwy klasy, w której się znajdują. Java jest językiem obiektowym, a static niebardzo nie pasuje do tego schematu. Oczywiście jest wiele sytuacji, w których użycie elementów statycznych jest korzystniejsze, jednak należy robić to świadomie. Tą świadomość jednak zdobywa się stopniowo, wraz z postępem nauki.
Pamiętaj, aby nie nadużywać statycznych elementów w swoim kodzie. Na to przyjdzie czas, kiedy zdobędziesz już swój zielony pas w Javie. Osu! 🥷
Podsumowanie
- statyczne funkcje/metody są związane bezpośrednio z klasą i wywołuje się je poprzez odwołanie do nazwy klasy
- niestatyczne funkcje/metody są związane z instancjami klasy i wywołuje się je na konkretnym obiekcie
Śledź mnie na LinkedIn
Newsletter
Jeśli masz jakieś sugestie lub pytania, proszę napisz do mnie wiadomość: kuba@javampokaze.pl