javamPokaze || Java Battle || Static vs Non-static
🛠️

javamPokaze || Java Battle || Static vs Non-static

 
notion image

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!
 
notion image

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;
    • Przykład 2: licznik operacji
    • 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 klasy System
    • public static void main(String [] args) - słynna metoda main()
    • 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.
 
notion image

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 lub private 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ą
notion image

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