Składowe statyczne Drukuj
Ocena użytkowników: / 5
SłabyŚwietny 
Instrukcje dodatkowe - Programowanie w języku JAVA
Wpisany przez Administrator   

Z tej lekcji dowiesz się:

  • co to są i do czego służą składowe statyczne

Nauczysz się

  • Stosować pola i metody statyczne

 

 

Składowe statyczne to pola i metody, które mogą istnieć i działać wtedy, kiedy nie istnieje obiekt danej klasy. W takim przypadku, takie pole lub metoda jest wspólne dla wszystkich obiektów danej klasy.

Jedyną zaś różnicą w zapisie, pomiędzy metodą czy polem statycznym a "zwykłym" jest wyraz static, który znajduje się na początku, ale po specyfikatorze dostępu.

np.:

public static void main

lub

static double metoda(double arg1, double arg1, double arg1){}

 



 

Metody statyczne

Aby to zobrazować posłużę się przykładem.

Zad. 1.: Napisz program, w którym:

1) stworzysz program główny Statyczne

2) stworzysz publiczną klasę algebra w udzielnym pliku, w której:

a) stworzysz metodę statyczną dodawanie, która będzie dodawała do siebie dwie wartości liczbowe przekazane jej przez argument l1 i l2. Metoda zwraca wynik typu float.

b) stworzysz metodę statyczną odejmowanie, która będzie dodawała do siebie dwie wartości liczbowe przekazane jej przez argument l1 i l2. Metoda zwraca wynik typu float.

3) Z poziomu programu

a) utworzysz klasyczny obiekt algebra1, w którym użyjesz obydwu metod

b) użyjesz metod bez tworzenia obiektu klasy algebra

 

Jeśli nie pamiętasz, w jaki sposób tworzymy klasy publiczne przypomnij sobie lekcję nt. Specyfikatory dostępu i pakiety (otworzy się w nowym oknie przeglądarki)

 

Bierne i bezmyślne przepisywanie kodu z listingu nie jest dobrą metodą nauki. Postaraj się do punktu 2.b napisać program samodzielnie, w ramach powtórki.

 

Oto listingi tego programu:

1) Tworzymy klasę główną Statyczne oraz 2) klasę publiczną algebra

2a) oraz 2b) Piszemy kod statycznych metod dodawanie i odejmowanie w klasie publicznej algebra

3) W kodzie klasy Statyczne następuje wywołanie metod: przez odwołanie do obiektu oraz przez odwołanie do metody statycznej klasy algebra.

 

 

Oto wynik działania programu dla przykładowych danych:

 

Jako swoiste doświadczenie spróbujmy teraz upewnić się co do jednej rzeczy: Na krótką chwilę w klasie algebra usuńmy zapis static i zobaczmy, czy program będzie działał poprawnie:

 

 

 

Usunęliśmy napis static. Wróćmy teraz do klasy Statyczne, aby zobaczyć, jakie są tego konsekwencje:

 

NetBeans informuje nas o błędzie. Przyjrzyjmy się bliżej temu komunikatowi:

NetBeans informuje nas o odwołaniu do nie-statycznej metody (przestała być statyczna, kiedy usunęliśmy zapis static)

Wniosek: zapis static jest niezbędny do tego, żeby metoda była statyczna.

 

Ćwiczenie do samodzielnego wykonania:

Zad. 2.: Zmodyfikuj powyższy program. Dodaj analogicznie metody statyczne iloczyn oraz iloraz, które mnożą oraz dzielą liczbę pierwszą przez drugą. Odwołaj się do nich poprzez odwołanie klasyczne (obiekt algebra1) oraz przez odwołanie "statyczne".

 

 


Pola statyczne

 

Pola statyczne, podobnie jak metody statyczne istnieją nawet wtedy, kiedy nie istnieje obiekt danej klasy.

 

Pole statyczne odróżnia się określeniem static, które występuje na początku, po ewentualnym specyfikatorze dostępu:

public static int bok = 10;

static int promien = 100;

static double cena;

 

Aby to zobrazować napiszemy oczywiście specjalny program, a właściwie zmodyfikujemy ten, który już wcześniej napisaliśmy:

Zad. 3.: Zmodyfikuj powyższy program:

1)w klasie algebra dodaj statyczne pole pi o wartości 3,14

2) wyświetl wartość pola pi dla utworzonego obiektu algebra1 klasy Algebra

3) w klasie głównej programu oblicz pole koła korzystając ze statycznego pola pi i wyświetl wynik na ekranie

 

Postaraj się napisać ten program samodzielnie.

 

ad. 1)

ad. 2) i 3)

 

Oto wynik wywołania programu:

 

Zrobimy jeszcze jedno doświadczenie, które, myślę, przyszło Ci również do głowy:

Skoro pole pi jest polem statycznym i wspólny dla wszystkich obiektów tej klasy, to czy można je zmienić i jeśli tak, to jaki będzie tego skutek?

Odpowiedź na powyższe pytanie da nam modyfikacja naszego programu:

Zad. 4.: Zmodyfikuj powyższy program:

1) Odwołaj się do pola statycznego pi klasy algebra i zmień jego wartość na 15 (zamiast 3,14)

2) w klasie głównej programu oblicz pole koła korzystając ze statycznego pola pi i wyświetl wynik na ekranie

3) odwołaj się do pola statycznego pi przez odniesienie z obiektu algebra1 klasy algebra i zmień jego wartość na 92  (zamiast 14)

4) w klasie głównej programu oblicz pole koła korzystając ze statycznego pola pi i wyświetl wynik na ekranie

Postaraj się napisać ten program samodzielnie.

Oto listingi do tego programu:

 

Wynik wywołania programu:

Jak widać na powyższym obrazku, za każdym razem wartość pola statycznego uległ zmianie, czego dowodem są wartości wyświetlane w poszczególnych.

Wnioski?

1) pola statyczne rzeczywiście są statyczne i wspólne dla wszystkich obiektów i nie-obiektów danej klasy, ponieważ zmiana tego pola owocuje zmianą jego wartości w każdym obiekcie klasy jak również w samej klasie źródłowej (algebra)

2) wartość pola statycznego można z takimi samymi konsekwencjami zmienić zarówno z poziomu odwołania "statycznego" jak również z poziomu odwołania poprzez obiekt danej klasy.

 


Co zyskujemy i co "tracimy" używając statycznych metod i pól?

 

Jeśli przypomnisz sobie pierwszy program z zadania 1., to łatwo zauważysz, że łatwiej i wygodniej było nam wykonać dodawanie  i odejmowanie "w locie" niż gdybyśmy musieli tworzyć obiekt tej klasy, który jest niepotrzebny, (jedynie pewna metoda klasy jest potrzebna). "Odchudza" to nasz program z niepotrzebnie zaalokowanej pamięci (na obiekt klasy) oraz odciąża procesor w wykonywania instrukcji konstruktora.

Elementy statyczne lokowane są w oddzielnym bloku pamięci nawet wtedy, kiedy nie istnieje obiekt danej klasy. W normalnych warunkach, komputer "zużywał" pamięć dopiero, kiedy trzeba w niej było ulokować obiekt danej klasy. jeśli w trakcie działania programu taki obiekt tej klasy nie powstał, pamięć nie była obciążona.

Drugą kwestią jest to, że statyczne metody i pola są wspólne dla ewentualnych wszystkich obiektów danej klasy. Oznacza to, że zmieniając np. wartość statycznego pola, zmienia się ono dla wszystkich obiektów tej klasy. Nie jest to pole prywatne, ale wspólne. Może to być bardzo dużym plusem i ułatwieniem (np.: w bazie danych przedsiębiorstwa wartość podatku VAT jako pola statycznego zmienia się z 23 na 18% dla wszystkich klas, nie trzeba zmieniać tego ręcznie oddzielnie w każdej klasie.

Czyli statyczne składowe mogą być bardzo dużym ułatwieniem, ale trzeba pamiętać, że ich używanie wiąże się z pewnymi konsekwencjami w strukturze kodu oraz w działaniu programu.

 


Zadania dola utrwalenia wiadomości:

 

Zad. 6.: Zmodyfikuj powyższy program. Niech użytkownik będzie mógł:

1) zmienić wartość pola promien tak, aby program liczył pole kół o różnych promieniach

2) zmienić wartość pola pi

3) Zastanów się, czy można coś zrobić aby uniemożliwić lub ograniczyć możliwość ingerencji (zarówno z poziomu kodu jak również z poziomu użytkownika) w wartość pola statycznego pi tak, aby np. przez pomyłkę nikt nie zmienił wartości pola pi i nie doszedł do błędnych wyników licząc pole koła.

 

 

Zad. 7 Zmodyfikuj powyższy program: dodaj do programu możliwość wyliczenia objętości walca. Zastanów się: jakie dane będą potrzebne? Jakie mogą być statyczne a jakie może podać użytkownik?

 

Zad. 8: Zmodyfikuj powyższy program:

1) przenieś funkcje geometryczne do klasy publicznej geometria, znajdującej się w osobnym pliku tworząc z nich statyczne metody

2) w klasie publicznej algebra pozostaw cztery stworzone metody statyczne: dodawanie, odejmowanie, iloczyn, iloraz.

 

Zad. 9.: Dla ambitnych: zmodyfikuj powyższy program:

1) dodaj do programu możliwość obliczania silni danej liczby.

2) zastanów się, w której klasie będzie ta metoda? Może trzeba dodać kolejną klasę?

3) zastanów się, jakiego typu będzie zarówno zmienna jak również metoda (czyli jakiego typu wynik metoda będzie zwracała)

 

Podpowiedź: silnia:

5! = 1*2*3*4*5

10! = 1*2*3*4*5*6*7*8*9*10

 

 


Rozwiązania zadań:

 

Zad. 6.: