58
Podstawy programowania w języku Java mgr inż. Piotr Kowalski 18 stycznia 2013

Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Embed Size (px)

Citation preview

Page 1: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Podstawy programowania w języku Java

mgr inż. Piotr Kowalski

18 stycznia 2013

Page 2: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Spis treści

1 Podstawy architektury komputera 51.1 Części składowe komputera . . . . . . . . . . . . . . . . . . . . . 5

1.1.1 Rzecz o rejestrach . . . . . . . . . . . . . . . . . . . . . . 61.1.2 Rzecz o pamięci . . . . . . . . . . . . . . . . . . . . . . . 61.1.3 Rzecz o programowaniu . . . . . . . . . . . . . . . . . . . 7

1.2 Języki programowania . . . . . . . . . . . . . . . . . . . . . . . . 81.2.1 Od kodu do programu . . . . . . . . . . . . . . . . . . . . 9

1.3 Funkcje systemu operacyjnego . . . . . . . . . . . . . . . . . . . . 91.3.1 Jądro systemu operacyjnego . . . . . . . . . . . . . . . . . 91.3.2 BIOS i uruchomienie stacji . . . . . . . . . . . . . . . . . 101.3.3 Systemy plików . . . . . . . . . . . . . . . . . . . . . . . . 101.3.4 Funkcja hashująca w systemie plików . . . . . . . . . . . . 11

2 Algorytmy i struktury danych 122.1 Struktury statyczne . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.1.1 Tablice . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.1.2 Rekordy . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.1.3 Obiekty . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.2 Struktury dynamiczne . . . . . . . . . . . . . . . . . . . . . . . . 132.2.1 Stos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.2.2 Kolejka . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.2.3 Lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.2.4 Drzewo binarne . . . . . . . . . . . . . . . . . . . . . . . . 132.2.5 Graf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.3 Porównanie typów struktur . . . . . . . . . . . . . . . . . . . . . 14

3 Wstęp - instalacja zintegrowanego środowiska programistycz-nego dla Javy 153.1 Czym jest wirtualna maszyna Javy oraz najważniejsze składowe

technologii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.2 Czym jest IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

4 Podstawy języka Java 184.1 Zmienne w Javie. Pierwsze starcie . . . . . . . . . . . . . . . . . 18

4.1.1 Typy prymitywne . . . . . . . . . . . . . . . . . . . . . . 194.1.2 Typy wyliczeniowe . . . . . . . . . . . . . . . . . . . . . . 194.1.3 Typy tablicowe . . . . . . . . . . . . . . . . . . . . . . . . 204.1.4 Klasy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

1

Page 3: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

SPIS TREŚCI 2

4.1.5 I jeszcze o zmiennych . . . . . . . . . . . . . . . . . . . . 214.1.6 Słowa zarezerwowane . . . . . . . . . . . . . . . . . . . . . 214.1.7 Znaki niepisane . . . . . . . . . . . . . . . . . . . . . . . . 224.1.8 Rzutowanie . . . . . . . . . . . . . . . . . . . . . . . . . . 224.1.9 Typ specjalny void . . . . . . . . . . . . . . . . . . . . . . 22

4.2 Podstawowe operacje w języku Java . . . . . . . . . . . . . . . . 234.2.1 Instrukcje warunkowe . . . . . . . . . . . . . . . . . . . . 234.2.2 Instrukcje pętli . . . . . . . . . . . . . . . . . . . . . . . . 244.2.3 Funkcje . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

4.3 Operatory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.3.1 Literały . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

4.4 Obsługa błędów w języku Java . . . . . . . . . . . . . . . . . . . 294.4.1 Drzewo hierarchii błędów . . . . . . . . . . . . . . . . . . 294.4.2 Komendy obsługi błędów . . . . . . . . . . . . . . . . . . 30

4.5 Inne reguły w języka Java . . . . . . . . . . . . . . . . . . . . . . 324.5.1 Nazewnictwo w Javie . . . . . . . . . . . . . . . . . . . . . 32

5 Tworzenie modeli w Javie 335.1 Tworzenie nowej klasy . . . . . . . . . . . . . . . . . . . . . . . . 335.2 Dziedziczenie i polimorfizm . . . . . . . . . . . . . . . . . . . . . 34

5.2.1 Interfejsy . . . . . . . . . . . . . . . . . . . . . . . . . . . 355.2.2 Modyfikator ’abstract’ i adnotacja ’@Override’ . . . . . . 36

5.3 Modyfikatory dostępu . . . . . . . . . . . . . . . . . . . . . . . . 375.3.1 Modyfikator ’final’ . . . . . . . . . . . . . . . . . . . . . . 38

5.4 Słowo kluczowe ’this’ oraz o konstruktorach . . . . . . . . . . . . 39

6 Korzystanie z pakietów podstawowych języka Java 416.1 Kontenery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

6.1.1 Kolekcje . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416.1.2 Iteratory . . . . . . . . . . . . . . . . . . . . . . . . . . . 426.1.3 Tablice asocjacyjne . . . . . . . . . . . . . . . . . . . . . . 426.1.4 Przeszukiwanie i sortowanie kontenerów . . . . . . . . . . 42

7 Tworzenie aplikacji z interfejsem graficznym Swing 437.1 Elementy pakietu Swing . . . . . . . . . . . . . . . . . . . . . . . 43

7.1.1 Uruchamianie okna głównego aplikacji . . . . . . . . . . . 447.1.2 Swing - menu . . . . . . . . . . . . . . . . . . . . . . . . . 457.1.3 Swing - kontenery . . . . . . . . . . . . . . . . . . . . . . 457.1.4 Swing - kontrolki . . . . . . . . . . . . . . . . . . . . . . . 46

7.2 Okienka dialogowe . . . . . . . . . . . . . . . . . . . . . . . . . . 467.2.1 Przykładowe użycia okienek dialogowych . . . . . . . . . 46

7.3 Wydarzenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467.3.1 Akcja wykonana . . . . . . . . . . . . . . . . . . . . . . . 46

7.4 Właściwości okna . . . . . . . . . . . . . . . . . . . . . . . . . . . 467.5 Nasłuchiwacze . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

A Zadania laboratoryjne 47

B Zadania projektowe 50

Page 4: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

SPIS TREŚCI 3

C Zadania do samodzielnego rozwiązania 52C.1 Zadanie z prostych algorytmów . . . . . . . . . . . . . . . . . . . 52C.2 Zadania z modelowania w języku Java . . . . . . . . . . . . . . . 52C.3 Zadania z prostych aplikacji graficznych . . . . . . . . . . . . . . 54

Page 5: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

SPIS TREŚCI 4

Wersjenumer data autor opis

0.1 10.10.2012 Piotr Kowalski Prace nad pierwszym rozdziałem0.2 13.11.2012 Piotr Kowalski Dołączone dziedziczenie, modyfikatory

dostępu oraz obsługa błędów0.3 27.11.2012 Piotr Kowalski Dołączone konstruktory oraz liczne za-

danka i projekty laboratoryjne.0.4 18.01.2012 Piotr Kowalski Dołączone zaczątki kolejnych rozdzia-

łów z: Kontenerów oraz Swing.

Page 6: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Rozdział 1

Podstawy architekturykomputera

1.1 Części składowe komputera

Do głównych elementów komputera należą

� Płyta główna

� Pamięć RAM

� Dysk twardy

� Karta graficzna

� Inne elementy

Szczególną uwagę przykuwa płyta główna jako komponent odpowiedzialnyza wykonywanie obliczeń i działanie programu. Głównymi elementami wchodzą-cymi w skład płyty głównej są:

Procesor jest główną jednostką obliczeniową całego systemu komputerowego,przeprowadza wszystkie operacje w komputerze.

Magistrala danych jest kanałem do przesyłania danych pomiędzy komponen-tami systemu. Jest jak ”rura” łącząca wiele wejść i wyjść. W danej chwilijej pracy, jedno urządzenie działa w trybie nadawania a drugie w odbioru,reszta pozostaje bierna czekając na swoją kolej. Zazwyczaj jednym z tychczynnych urządzeń jest procesor.

Rejestry są najszybszym typem pamięci (i najdroższym) i to od ich wykorzy-stania przez procesor w głównej mierze zależy szybkość oprogramowania.Rozmiar rejestrów zależy od tzw. architektury procesora. Pierwsze proce-sory były konstruowane w architekturze 16 bitowej co oznaczało że proce-sor operował na danych o rozmiarze do 16 bitów, zatem był wyposażonyw rejestry o pojemności 16 bitów. Obecnie dominują procesowy 32 bitowe,część rynku jest jednakże już opanowywana przez procesory 64 bitowe.

5

Page 7: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 1. PODSTAWY ARCHITEKTURY KOMPUTERA 6

Sterownik przerwań , ponieważ komputer pracuje równolegle nad być możewieloma zadaniami, może się okazać że w trakcie pracy nad jednym z nich,jedno z urządzeń zgłosi procesorowi żądanie by ten sprawdził jego stani wykonał pewne operacje. By proces ten był nadzorowany i odpowied-nio kolejkowany (które urządzenie jako kolejne powinno być obsłużone)wprowadzony został sterownik przerwań. Sterownik przerwań jest mikro-kontrolerem który nadzoruje zgłaszane ”przerwania” (tu: żądania prze-rwania bieżącego zadania przez procesor), ustala ich priorytet i delikatnie”szturcha” procesor gdy nadejdzie przerwanie. Przykładem może być wci-śnięcie przycisku na klawiaturze, które spowoduje zgłoszenie przerwaniacelem odczytania znaku z bufora klawiatury. Innym rodzajem przerwaniasą np. mrugania diody LED na przerwanie zgłaszane przez dysk twardy.

Zegar jest urządzeniem, które odmierza pewien krótki okres czasu w kompute-rze i może być wykorzystane zarówno do przerwań systemowych, jak dlainnych celów. Zbudowane jest na zasadzie drgającej struktury krystalicz-nej.

1.1.1 Rzecz o rejestrach

Rejestry są podstawową pamięcią komputera. To na danych w nich zawartychsą wykonywane wszystkie obliczenia. Rejestrów w architekturze rodziny proce-sorów Intel32 występuje ich około 20-tu. Do najważniejszych należą:

EAX / AX jest rejestrem nazywanym Akumulatorem. Jego nazwa pochodziod tego, że to najczęściej w nim umieszczane są wyniki pracy procesora(akumuluje wyniki).

EBX / BX jest rejestrem adresowania. W tym rejestrze składowane są adresyw pamięci RAM w chwili gdy procesor stara się je odczytać lub zapisać.

ECX / CX rejestr odliczający. Jest rejestrem ładowanym pewną daną przyokazji wykonywania wszelakich pętli w trakcie obliczeń. Jest ładowanypewną wartością, która co wykonanie pętli jest zmniejszana automatycz-nie o 1. Gdy osiągnie wartość 0 pętla jest zatrzymywana. W tej formierozwiązania pętli można dostrzec przewagą (i przyczynę) osobnego two-rzenia pętli FOR.

CS, DS rejestry obszaru pamięci. Po załadowaniu programu do pamięci RAM,obszar pamięci gdzie znajduje się kod programu jest oznaczany w reje-strze CS (CODE SEGMENT), zaś dla danych ma adres ich składowaniaznajduje się w rejestrze DS (DATA SEGMENT)

REJESTR FLAGOWY jest specjalnym rejestrem procesora, gdzie składo-wane są nie dane wyjściowe procesora, ale błędy które zostały zgłoszonew trakcie obliczeń.

1.1.2 Rzecz o pamięci

W kwestii pamięci procesora, wyróżnioną role pełni pamięć RAM. Dysk twardynie pełni żadnej innej funkcji poza funkcją składowania danych. Wszelkie ope-racje procesora na danych z dysku, muszą być poprzedzone przekopiowaniem

Page 8: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 1. PODSTAWY ARCHITEKTURY KOMPUTERA 7

tychże danych do pamięci RAM procesora. Pamięć RAM po załadowaniu sys-temu operacyjnego jest dzielona na obszar do użytku oraz na stos procesora.Stos procesora jest miejscem gdzie mogą być składowane dane. Zgodnie z za-sadą stosu rzeczy odłożone później są zdejmowane wcześniej. Stos jest bardzoczęsto wykorzystywanym obszarem pamięci.

Przykłady użycia stosu

� Tymczasowe zachowanie stanu rejestrów, np gdy potrzeba rejestrów dokolejnych obliczeń a nie można poświęcić posiadanych danych.

� Wykonanie przerwania - w chwili pojawienia się przerwania wszystkie danenad którymi pracował procesor muszę być zachowane tak by po zakończe-niu przerwania procesor mógł kontynuować pracę. Na stos są wtedy zrzu-cane wszystkie używane rejestry włącznie z flagowym oraz wskaźnikiemdo punktu w kodzie gdzie nastąpiło przerwanie.

� Wywołanie funkcji - w chwili wywołania funkcji podobnie jak przy prze-rwaniu, wszystkie dane zostają zapisane na stosie.

� Przekazanie parametrów do funkcji - Często lista parametrów funkcji jestbardzo długa. Wtedy nie jest możliwym przekazać ich przez rejestry (przekazywanie przez rejestry jest nawet nie wskazane). Jedyną możliwościąjest odłożyć je wtedy przez stos tak by nowa funkcja mogła go łatwoodzyskać ze stosu.

1.1.3 Rzecz o programowaniu

W programowaniu występuje mnóstwo głównych reguł. Jednakże najważniejszereguły informatyki to:

� Niezależność poziomów programowania

� Zgodność wstecz

Poziomy programowania

Napisanie programu jest z reguły rzeczą trudną. Wymaga dokładnego przemy-ślenia sytuacji, z którą program ma sobie radzić, zapobiec dopuszczenia do błęduprogramu oraz wykonania optymalnej ilości operacji by kod był szybki. Nie jestjednak nigdy tak, że jeden programista pisze cały program. Częściej programi-ści dzielą program na małe części i każdy realizuje jego część. Nigdy nie jestrównież tak, że program raz napisany nie zostanie już nigdy poprawiony. Ważnązasadą jest więc właśnie to by programy mogły korzystać z siebie nawzajemw sposób bezpieczny i niezmienny pomimo oczywistych poprawek lub niezna-jomości innego programu. Prostym przykładem jest np. zainstalowanie nowegosterownika do drukarki. Pomimo, że program sterownika działa zupełnie inaczej,programy wyżej powinny mieć możliwość wywoływać DRUKUJ bez względu nato jak dany sterownik realizuje tą funkcję. Jest to tzw. niezależność poziomówprogramowania.

Page 9: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 1. PODSTAWY ARCHITEKTURY KOMPUTERA 8

Interfejsy

Interfejsem będziemy nazywać dowolny zestaw czynności udostępnianych przezprogram lub aplikację. Tak naprawdę zaś interfejs jest fikcyjnym programem,który ma zapewniać to, że inne programy będą mogły się do pewnej funkcjonal-ności odwoływać pomimo, że programista mógł zupełnie zmienić samą funkcję.Korzystanie z interfejsów zapewnia jednak to, że programy mogą ze sobą bez-piecznie współpracować, mimo iż byłyby modyfikowane.

Zgodność wstecz

Niektórzy nazywają największą zmorą programistów. Przyczyny jej stosowaniasą czysto ekonomiczne. Zachowanie zgodności wstecz to nic innego jak zapewnie-nie starszym programom możliwości pracy. I również w tym punkcie nieocenioneokazują się być interfejsy, które potrafią poprawić to co robią stare programy iw miarę możliwości zastosować usprawnienia. Przykładem jest np. to że nowewersje MS-WORDa potrafią otwierać pliki z poprzedniej wersji programu np zroku 97. Pomimo to, programy te niechętnie pozwalają zapisywać w starych for-matach, które są mniej wydajne lub wręcz nie pozwalają na pewne dodatkowefunkcje. Z tej samej przyczyny architektura systemu MS-Windows nie zmieniłasię zbytnio od roku 1994.

1.2 Języki programowania

Pomiędzy językiem który rozumie procesor komputerowy, a językiem ludzkimjest olbrzymia przepaść. Nie jest możliwym aby przeskoczyć te różnice i aniprocesor nie zacznie ”słuchać po ludzku” ani programista nie napisze programuza pomocą ciągu zer i jedynek. Muszą istnieć zatem narzędzia, specjalne trans-latory które tłumaczyły by nawzajem te języki. Jako, że różne są potrzeby iwymagania wyróżnia się 5 generacji języków.

Języki procesora - I Generacja - jest językiem komend procesora, jegoskładnia jest różna dla różnych procesorów i jest bardzo zorientowana nastronę techniczną procesora. Dominuje tu poprawianie programu poprzezlepsze realizowanie poleceń procesora.

Języki komend procesora - II Generacja - Asemblery - jest to język dy-rektyw wydawanych procesorowi. Nie zależy on od rodzaju procesora. Wprogramach tych poprawianie realizuje się poprzez lepsze zarządzanie pa-mięcią. W asemblerach pisze się głównie sterowniki dla sprzętu.

Języki proceduralne - III Generacja - podstawowa generacje języków pro-gramowania. Jest to najniższa generacja języków niezależnych sprzętowotzn. ten sam kod programu działa tak samo na różnych komputerach,choćby były zupełnie inaczej zbudowane. Słowo proceduralne w nazwieokreśla, że programista dokładnie określa zadanie, które wykonać ma pro-gram. Przykładowe języki programowania to C, C++ ,C#, D, Pascal,Java, Ada95.

Języki deklaratywne - IV Generacja - języki programowania z tej grupy sąbardzo przyjazne użytkownikowi. W przeciwieństwie do proceduralnych,

Page 10: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 1. PODSTAWY ARCHITEKTURY KOMPUTERA 9

tu program automatycznie stara się zrozumieć co miał na myśli użytkow-nik by uzupełnić jego kod. Przykładami takich języków są : SQL, HTML,XML, BASH, PYTHON, PERL, PHP , AWK.

Języki inteligentne - V Generacja - dopiero rozbudowywana gałąź samo-uczących się programów. Rzadko stosowana.

Języki I i II generacji nazywa się językami niskiego poziomu - jako, że pozwalajątworzyć oprogramowanie zależne od sprzętu, języki wyższych generacji nazywa-ne są językami wysokiego poziomu, jako niezależnym sprzętowo.

1.2.1 Od kodu do programu

Ze względu na to, że języki V generacji są wielką innowacją, a języki II generacjisą niewydajne w tworzeniu aplikacji, programiści skupiają się na pracy w języ-kach III i IV generacji. Programy stworzone w językach III generacji nazywamykodem, zaś programy stworzone w IV generacji nazywamy skryptami. Pomiędzynimi zachodzi istotna różnica.

Z tą różnicą związane są dwa pojęcia

Kompilator - program komputerowy, którego zadaniem jest tłumaczenie koduna języki coraz to niższego poziomu, aż do utworzenia kodu maszynowego.Jest to postępowanie, któremu podlegają języki 3 poziomu.

Interpreter - program komputerowy, którego zadaniem jest wykonanie ciągupoleceń umieszczonych w programie języka IV generacji, zwanym skryp-tem. Jest to opis ciągu wywołań kolejnych programów niższego poziomu,celem uzyskania określone efektu.

Z racji istnienia takiej struktury rzeczy, zauważyć możemy, że jeden kod wysokie-go poziomu, może różnie działać ze względu na miejsce jego kompilacji. Oznaczato również, że skompilowany program przeniesiony na inną stację komputerowąmoże działać błędnie lub w ogóle. Z drugiej strony mamy jednak zapewnienie,że na poziomie logicznym kod wykonany na jednej i drugiej stacji da takie samewyniki.

1.3 Funkcje systemu operacyjnego

1.3.1 Jądro systemu operacyjnego

W komputerze niezwykle istotną funkcję pełni system operacyjny (ozn. OS).Pełni on role interfejsu pomiędzy programami, a architekturą komputera i urzą-dzeniami doń podłączonymi. System operacyjny składa się z:

� Jądra systemu

� Aplikacji systemu

� Sterowników

Aplikacjami systemu są wszystkie programy zainstalowane na systemie by za-pewnić jego podstawową działalność. Wszystko co komputer może wykonać dla

Page 11: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 1. PODSTAWY ARCHITEKTURY KOMPUTERA 10

innych programów w systemie jest jednakże zdefiniowane w jądrze systemu ope-racyjnego. Nie jest możliwym by jakikolwiek program znajdujący się powyżejpoziomu jądra systemu był w stanie bezpośrednio wywołać aplikacje z poziomuponiżej. Jądro systemu świadczy zestaw metod i jeśli jakieś zastosowanie jestzgodne z zasadami pracy systemu komputerowego, to jest przesyłane poniżej.Najczęściej jądro służy do przekazania poleceń wywołania do poszczególnychsterowników. Sterowniki mają szczególną pozycję w systemie operacyjnym i dla-tego ich instalacja musi być bardzo odpowiedzialna. Taka struktura systemu manatomiast wiele zalet w kwestii bezpieczeństwa. W ten sposób programy, wy-woływane osobno nie mogą mieć na siebie wzajemnego wpływu, gdyż wszystkieoperacje są nadzorowane przez jądro systemu.

1.3.2 BIOS i uruchomienie stacji

BIOS jest specyficznym rodzajem oprogramowania. Jest to oprogramowanie ty-pu ROM tzn. jedynie do odczytu (choć od tego by był to czysty ROM, ostatniosię odchodziło to obserwuje się tego negatywne skutki), związane z poszczegól-nymi elementami stacji komputerowej. Jedną z głównych rol BIOSu jest uru-chamianie stacji. Kolejne etapy uruchamiania stacji (orientacyjne):

1. Start BIOSu płyty głównej

2. Poszukiwanie na kolejnych pozycjach systemów operacyjnych

3. Start jądra systemu

4. Start podstawowych usług systemu - montowanie systemów plików

5. Start trybu graficznego (lub nie :P)

6. Wyświetlenie okna logowania

1.3.3 Systemy plików

Nie rozłącznym pojęciem dla każdego OS-u jest system plików. Jest to sposóbzapamiętywania danych na dysku twardym. Sposób taki, musi być wydajny -byśmy mogli zapisać jak najwięcej danych oraz bezpieczny - byśmy nie stracilidanych. Jak łatwo przypuszczać ma się albo jedno albo drugie. Najczęściej całośćwygląda następująco.

DYSK FIZYCZNY - stanowi górny limit dla składowania danych.

PARTYCJA - obszar zapamiętania poszczególnych danych.

SEKTORY - obszar umieszczenia danych

KLASTRY - jednostka pojemności pamięci. Pojedyncza dana zapisana na dys-ku jest w klastrze.

Dysk fizyczny, ma w swoim nagłówku listę wszystkich partycji na niej utwo-rzonych (TABLICA PARTYCJI).Oprócz tego znajduje się tu również MBR(MasterBootRecord) bardzo ważny element wskazujący położenie ewentualnegoprogramu ładującego system operacyjny. Partycja zaczyna się z kolei elemen-tem TOC (TABLE OF CONTENT) - tj tablicy zawierania. Są tu umieszczone

Page 12: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 1. PODSTAWY ARCHITEKTURY KOMPUTERA 11

wszystkie pliki na dysku, a dokładniej lokalizacja ich początku. Pliki znajdująsię na dysku w postaci rozproszonej. W TOC znajduje się położenie pierwszegokawałka pliku, na końcu pierwszego kawałka znajduje się położenie następnegokawałka itd. Systemami plików stosowanymi obecnie są: NTFS dla windows,EXT3/4 dla linux. Oprócz tego historyczne formaty to FAT16, FAT32 i VFAT(obecnie na pendrive’ach).

1.3.4 Funkcja hashująca w systemie plików

Stosowanie tablicy plików jest dobrym rozwiązaniem w kwestii zapisu plików,jednak zapis nie jest jedyną główną operacją w systemie plików. Inną przykłado-wą funkcją systemu plików jest wyszukiwanie pliku o pewnej cesze, powiedzmynazwie. Prosta tablica plików nie jest wygodnym do poszukiwania rozwiązaniem.Trzeba by przejrzeć średnio połowę, a w najgorszym wypadku wszystkie zapisytablicy, których może być bardzo dużo. Potrzebna jest subtelniejsza struktura,która jednak nie spowoduje opóźnień w dostępie do plików.

Najprostszym rozwiązaniem byłoby podzielenie jedne dużej tablicy na kil-ka (a raczej kilka-dużo np kilka tysięcy) mniejszych tablic zawierających tylkowybrane rekordy. Więc można by przykładowo podzielić tekst ze względu napierwszą literę w nazwie pliku. To podzieli zespół nazw na około 27 grup, coskróci przeszukiwanie 27 razy ...

Błąd. Przyśpieszenie wcale nie będzie nawet tak średnio dobre. Problememjest liczność poszczególnych grup. Jak często trafiają się nam słowa na literę Ya jak często na literę K. Podział, który powinniśmy zastosować powinien zapew-nić nam możliwie równomierne rozłożenie składu tych grup. Zatem potrzebnejest przyporządkowanie odpowiednich grup odpowiednim nazwom. Są to bardzoskomplikowane w wypracowaniu, ale proste w użyciu funkcje nazywane fachowohashującymi.

Page 13: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Rozdział 2

Algorytmy i strukturydanych

Napisanie programu nie jest niczym trudnym. Prawdziwą trudnością programi-styczną jest zrobienie tego przy minimalnych nakładach. Programy optymalizujesię ze względu na dwie ich cechy:

Ilość operacji - mierzona w taktach procesora;

Zużycie pamięci - mierzona w ilości wykorzystanej pamięci

W zależności od stawianych sobie wymagań wykorzystuje się różne struktury iróżne metody prowadzenia obliczeń. Postaram się teraz omówić kilka najprost-szych struktur.

2.1 Struktury statyczne

Pierwszym typem struktur są struktury statyczne. Wszędzie w programowaniuokreślenie statyczne będzie się odnosiło do tworów, które są tworzone w chwiliuruchomienia kodu (tzn. już w momencie uruchomienia programu, a zanim zo-stanie wykonane jakiekolwiek polecenie te struktury otrzymują swój przydziałw pamięci).

2.1.1 Tablice

Tablice są najprostszym sposobem łączenia wielu danych. Pozwalają one połą-czyć jednakowe obiekty w jedną większą strukturę. Cechą naturalną tablicy jestjej długość i rodzaj zawieranych danych.

2.1.2 Rekordy

Rekordy są sposobem na generowanie bardziej złożonych typów danych poprzezłączenie określonej liczby elementów prostszych. Najlepszym przykładem jestdata, która jest typem złożonym z liczby odpowiadającej dniu, liczby odpo-wiadającej miesiącowi oraz liczby roku. Cechą szczególną rekordów jest to, żepotrafią łączyć składowe różnych typów w przeciwieństwie do tablic.

12

Page 14: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 2. ALGORYTMY I STRUKTURY DANYCH 13

2.1.3 Obiekty

Obiekty w najprostszym ujęciu są pewnym uogólnieniem rekordów, ale że jestto temat obszerny jeszcze zdąży być omówiony.

2.2 Struktury dynamiczne

2.2.1 Stos

Często fachowo pieszczotliwie nazywany LIFO (Last In - First Out). Informa-tycy żartują, że ta struktura danych została stworzona przez Jezusa (”Pierwsibędą ostatnimi, a ostatni pierwszymi”). Jako struktura ma następującą postać.By utworzyć stos potrzebne są dwa twory. Twór o nazwie stos, oraz twory onazwie elementy stosu. Element stosu jest swego rodzaju otoczką, która oto-czy element odkładany na stos. Ponadto każdy element stosu wskazuje element,który znajduje się na stosie poniżej jego, lub jeśli jest ostatni nie pokazywaćniczego. Twór stosu jest zarządcą struktury. Pokazuje zawsze wierzchołek stosuoraz wie jak zrealizować dwie główne operacje stosu.

PUSH - odłożenie kolejnego elementu na stos.

POP - zdjęcie elementu z wierzchołka stosu.

Operacjami, które są bardzo trudnymi do wykonania na stosie to usuwanie zwnętrza stosu oraz np. sortowanie.

2.2.2 Kolejka

Kolejka jest z kolei pieszczotliwie nazywana FIFO (First In - First Out). Po-dobnie jak stos, struktura ta składa się z elementów kolejki i samej kolejki.Elementy kolejki pokazują element je poprzedzający (”ta pani stała przede tuprzede mną”), zaś sama kolejka musi tym razem pamiętać i swój początek i swójkoniec. Operacje identyczne jak dla stosu.

2.2.3 Lista

Zwana też niekiedy listą dwukierunkową. W tej strukturze zmianie ulegają ele-menty listy, które pamiętają i poprzednika i następnika. Użycie takiej ulepszonejkolejki pozwala łatwo z niej usuwać elementy.

2.2.4 Drzewo binarne

Z goła odmiennymi strukturami są drzewa. Drzewa są strukturami o zupeł-nie odmiennym podejściu niż listy, kolejki i stosy. Drzewa składają się z tworudrzewa oraz tzw. węzłów (ang. node) (którym odpowiadają rozgałęzienia). Drze-wo pamięta swoją podstawę tzw. korzeń (ang. root). Węzły są otoczką dla da-nych. Dodatkową informacją jest położenie kolejnych węzłów. Jeden węzeł możewskazywać wiele innych węzłów (maksymalnie pewną określoną ilość - najczę-ściej dwa). Jeśli węzeł nie wskazuje żadnych kolejnych węzłów to nazywamy goliściem (ang. leaf). Drzewa, a w szczególności drzewa binarne są najlepszą struk-turą do przechowywania uporządkowanych struktur danych. W takim układzie

Page 15: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 2. ALGORYTMY I STRUKTURY DANYCH 14

wyszukiwanie, usuwanie, dołączanie i wiele innych operacji może być wykona-nych rekordowo szybko.

2.2.5 Graf

Tak po prawdzie wszystkie struktury danych są z punktu widzenia matematykipewnymi grafami. Dla ogólnych grafów najczęściej tworzy się tablicę z posia-danych danych oraz inną strukturę do oznaczenia krawędzi i ich ewentualnychwag.

2.3 Porównanie typów struktur

Struktury dynamiczne są najczęściej stosowanymi w programowaniu. Struktu-ry statyczne co prawda wśród swoich zalet mają prostotę oraz maksymalnąszybkość przy tworzeniu i dostępie, jednakże mają znacznie poważniejsze wa-dy. Absorbują i nigdy nie zwalniają dużej ilości miejsca, jak również że przy ichtworzeniu może nie istnieć dostatecznie długa przestrzeń pamięci by ją utworzyć.

Page 16: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Rozdział 3

Wstęp - instalacjazintegrowanego środowiskaprogramistycznego dla Javy

W części pierwszej skupimy się na przygotowaniu komputera jako stanowiskapracy programisty. W przypadku programowania w technologii Java (nazywa-my to technologia, gdyż myślimy łącznie o języku, narzędziach, jak i sposobiemyślenia), może być to wykonane niemalże na każdym ciut bardziej zaawanso-wanym urządzeniu elektronicznym, telefon, tablet, netbook aż w końcu nawet inajwiększych komputerach. W odróżnieniu od poprzedzających ją technologii,raz napisany program będzie mógł działać na każdym urządzeniu. Technologietakie jak C/C++, Ada95, Pascal czy inne generowały kod maszynowy, którypozwalał programom działać na urządzeniach o podobnej specyfikacji. Częstoaby zaadaptować ten sam program potrzebne były poprawki jego kodu. W przy-padku Javy, ten problem został niemal doszczętnie wyeliminowany.

3.1 Czym jest wirtualna maszyna Javy oraz naj-ważniejsze składowe technologii

Podstawowym problemem kompilacji1 programów, jest to że w pewien spo-sób umieszcza ona w kodzie maszynowym2 konstrukcję komputera na którymzostała przeprowadzona. W przypadku Javy rozwiązano to poprzez specjalnyprogram instalowany w urządzeniu, który udaje przed programem napisanymw Javie, cały komputer. Sprawia to że cały kod można łatwo przenosić pomię-dzy urządzeniami. Tym programem jest wirtualna maszyna Javy (JVM - JavaVirtual Machine). Jej instalacja jest niezbędna do tego by na danym urządzeniudział jakikolwiek program w tej technologii.

Wirtualna maszyna jest obecnie jedynie częścią większej całości. Do tegoby uruchamiały się programy potrzeba również wielu standardowych bibliotek.Wirtualna maszyna razem wspólnie z tymi bibliotekami jest udostępniania jako

1proces zamiany kodu programu podanego przez programistę na jego binarny odpowiednikdla procesora2kod po kompilacji, kod binarny rozumiany przez komputer

15

Page 17: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 3. WSTĘP - INSTALACJA ZINTEGROWANEGO ŚRODOWISKA PROGRAMISTYCZNEGODLA JAVY16

środowisko uruchomieniowe java (JRE - Java Runtime Environment). W przy-padku programistów potrzeba jeszcze znacznie więcej bibliotek, podobnie jakdużo dokumentacji i innych narzędzi. Wszystko wspólnie można pobrać jakoZestaw Narzędzi Programisty Java (JDK - Java Development Kit). JDK wystę-pują w różnych wersjach. Zalecane jest zawsze używanie najnowszych, jako naj-bezpieczniejszych i najaktualniejszych. JDK powinna być dołączona do systemuprzy instalacji IDE (o którym zaraz). Jeśli nie została, należy ją doinstalowaćręcznie.

3.2 Czym jest IDE

O tym jak dużo jest czasami pracy aby z kodu napisanego przez programistęzrobić kod rozumiany przez komputer, wystarczy zapytać starszych programi-stów. Tymczasem prawda jest taka, że ten proces jest dość prosty, a jedyniebardzo męczący w prowadzeniu. Zgodniej z zasadą co nudne należy automaty-zować wkrótce powstały narzędzia, które miały przejąć od programisty zadaniepilnowanie tego. Programy te są rozwijane po dziś dzień i większość programi-stów nie wyobraża sobie pracy bez nich. Główne aspekty z procesu tworzeniakodu przez nie monitorowane to

� Proces kompilacji kodu

� Weryfikacja składni kodu

� Zarządzanie bibliotekami

� Zarządzenia konfiguracją

� Nadzór wersji kodu

� Zarządzanie testami

� Pobieranie brakujących bibliotek

� Generowanie prostych i monotonnych fragmentów kodu

� Przeszukiwanie kodu źródłowego

� Reorganizacja nazw w kodzie (tzw. refaktoring)

� Podpowiadanie i kolorowanie składni

� Generowanie i przedstawianie dokumentacji

Wszystkie narzędzia o których tu wspominam są nazywane IDE czyli zintegro-wanymi środowiskami programistycznymi (ang. Integrated Development Envi-ronment).

W przypadku języka Java na rynku dominują dwa najsilniejsze programy(oba darmowe). Jednym z nich jest Eclipse, stanowiący wolne oprogramowaniebędące własnością Fundacji Eclipse. Drugim programem jest Netbeans, darmo-wa aplikacja stanowiąca własność amerykańskiego giganta na rynku oprogra-mowania czyli firmy Oracle (firmy, który wykupiła firmę Sun - twórców językaJava). Zasadniczo osoby, które są z zawodu programistami i tworzą duże pro-jekty, wybierają za swoją platformę Eclipse, jako prościej konfigurowalny do

Page 18: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 3. WSTĘP - INSTALACJA ZINTEGROWANEGO ŚRODOWISKA PROGRAMISTYCZNEGODLA JAVY17

ich potrzeb. Osoby o mniejszych potrzebach programowania z reguły wybierająNetbeans, z uwagi na dużą ilość wbudowanych narzędzi. O ile kod java możebyć bezproblemowo przenoszony pomiędzy platformami Eclipse i Netbeans, otyle konfiguracja projektów i algorytmu budowania różnią się na tyle, że z re-guły nie udaje się przenieść projektu pomiędzy tymi platformami. Oczywiściskompilowane kody przenoszą się bez problemu.

Z uwagi na początkujący charakter czytelnika, w dalszej części zakładamy, żeczytelnik posiada na swoim komputerze zainstalowany zarówno zestaw narzędziJava czyli jdk jak i Netbeans IDE. W takim układzie możemy spokojnie przejśćdo nauki podstaw tego prostego języka jakim jest Java.

Page 19: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Rozdział 4

Podstawy języka Java

Aby nie programować na kartce papieru zacznijmy od razu od utworzenia nowe-go projektu. Wybierzmy z menu plik okna Netbeansa, nowy projekt typu JavaApplication i nazywamy go HelloWorld. Automatycznie zostanie nam wygene-rowana klasa HelloWorld oraz w niej funkcja main(String[]). Aby nasz projektcoś napisał musimy wywołać metodę println() z klasy System dla jej elementuout tj.

System.out.println("Hello World!!"); // tak wypisujemy tekst na ekranie

Co musimy umieścić w kodzie funkcji main(String[]):

public static void main(String[] args) {System.out.println("Hello World!!"); // tak wypisujemy tekst na ekranie

}

Aby mieć lepsze zrozumienie co tak naprawdę się stało możemy zrobić to wolniej

public static void main(String[] args) {String hello = "Hello World!!"; // tak tworzymy zmienną o typie tekstuSystem.out.println(hello); // tak wypisujemy zmienną tekstową// a to oczywiście był znak komentarza

}

Program utworzył nową zmienną o nazwie hello i wstawił tam ciąg znaków HelloWorld!!, a następnie wypisał stan tej zmiennej.

4.1 Zmienne w Javie. Pierwsze starcie

Programowanie jest niczym innym jak opracowywaniem pewnego zbioru danych.Dane te muszą znaleźć się najpierw w pamięci komputera. To co wyróżniło Javęw porównaniu do jej poprzedników to sposób w jaki można modelować bardzoskomplikowane dane. Tak czy inaczej musimy poznać podstawowe typu danychaby umieć z nimi pracować.

W Javie typy danych można podzielić na podstawowe 4 grupy

1. Prymitywne

2. Wyliczeniowe

18

Page 20: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 4. PODSTAWY JĘZYKA JAVA 19

3. Tablicowe

4. Klasy

Zacznijmy od najprostszych

4.1.1 Typy prymitywne

Typu prymitywne są podwalinami wszystkich pozostałych typów danych. Po-zwalają one gromadzić najprostsze informacje w pamięci komputera. Jest 8 ty-pów prymitywnych. Pierwsze 4 czyli ’byte’, ’short’, ’int’ oraz ’long’ są typamiktóre służą do przechowywania w pamięci komputera liczb całkowitych. Dwakolejne czyli ’float’ i ’double’ służą do przechowywania w nich liczb zmienno-przecinkowych czyli przybliżeń liczb rzeczywistych. Typ do składowania danejzmiennej wybiera programista i musi kierować się wartościami liczba jakie będątam składane. Najczęściej wybiera się typy int oraz double. Ostatnie dwa ty-py to ’char’, czyli znak alfanumeryczny oraz ’boolean’ czyli typ prawda-fałsz.Poniżej przykład zadeklarowania (zgłoszenia do użycia) każdego z powyżej wy-mienionych typów.

/* typy całkowite */byte calkowity1bajt;short calkowity2bajty;int calkowity4bajty;long calkowiry8bajtow;/* typy zmiennoprzecinkowe */float zmiennoprzecinkowa4bajty;double zmiennoprzecinkowa8bajtow;/* inne zmienne */char znak;boolean logiczny;

W przypadku Javy, wszystkie nieprzypisane wartości prymitywne są od razuinicjowane pewną wartością. Dla liczb są to zera, fałsz dla typu logicznego orazznak pusty dla typu znakowego.

4.1.2 Typy wyliczeniowe

Typ wyliczeniowy tworzy się poprzez stworzenie ciągu określeń, które wypełnia-ją jego sens. Np.

enum PoraRoku { WIOSNA, LATO, JESIEN, ZIMA};

Przyjmuje się, że wartości stałe nazywa się pisząc wszystko dużymi literami.Odróżnia to je od tworzonych zmiennych, do nazwania których używa się małyliter. Jeśli nazwa zmiennej ma łączyć w sobie kilka słów, przyjmuje się że pozapierwszym z nich, wszystkie rozpoczynamy z wielkiej litery. Później dowiemysię, że wszystkie pierwsze litery piszemy z wielkiej litery np. w nazwach klas.

Jak używa się typu wyliczeniowego? Bardzo prosto

enum PoraRoku { WIOSNA, LATO, JESIEN, ZIMA};/**

Page 21: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 4. PODSTAWY JĘZYKA JAVA 20

* @param args the command line arguments*/public static void main(String[] args) {/* użycie typu wyliczeniowego */PoraRoku pora = PoraRoku.WIOSNA;}

Typy wyliczeniowe mają jeszcze inne możliwości ale na razie je przemilczymy.

4.1.3 Typy tablicowe

Tworzenie bardziej skomplikowanych danych jest możliwe na dwa sposoby. Pierw-szym z nich jest łączenie kilku cech i określanie ich wspólną nazwą np. przezadres zamieszkania danej osoby można rozumieć zgrupowanie w pamięci kompu-tera nazwy miasta, nazwy ulicy i numeru domu/mieszkania. Ten typ doprowadzinas do pojęcia klasy. Tymczasem na razie interesuje nas drugi z typów genero-wania nowych typów. Gdy nauczyciel wchodzi do klasy i mówi, że ”ma wynikiklasówki” to odnosi się do do nich jak do pojedynczego tworu. Wynik klasówkiskłada się z grupy elementów tego samego typu. Nauczyciel sprawdzał je bio-rąc klasówkę numer 1, potem klasówkę numer 2 i tak kolejno. Tworzyć większetypy danych można zatem również grupując twory podobnego kształtu w tabli-cę tychże tworów. Do tworzenia tablic używa się operatora[] umieszczając przytypie który ma stać się bazą tablicy.

int[] tablicaLiczbCalkowitych = {1,2,3,4,5};char[] tekst = {’s’,’ł’,’o’,’w’,’o’};boolean[] prawyIFalsze = { true, false, false, true};double[] liczby = { 3.14, 2.78};PoraRoku[] ulubionePoryRoku = {PoraRoku.LATO,PoraRoku.JESIEN};

tablicaLiczbCalkowitych[2]=3; // a tak uzyskujemy dostęp do//któregoś elementu tablicy

Uwaga nie ma przeciwwskazań aby również elementy klas łączyć w tablice.

4.1.4 Klasy

Jeżeli chodzi o klasy w javie to potrafią one opisać niemal wszystko. Wszyst-kie typy danych, które nie są typami prymitywnymi okazują się być obiektami.Obiekty to twory pasujące do pewnego wzorca czyli klasy. Łatwo zrozumiećróżnice pomiędzy obiektami, a klasami. Klasą jest człowiek, natomiast palcemwskazana osoba jest stworzona na podstawie klasy człowieka i to czyni ją obiek-tem człowieka.

Klasą są np. tworzone przez nas przed chwilą tablice. Najpowszechniej sto-sowaną klasą jest klasa String czyli rozbudowana tablica znaków alfanumerycz-nych. W prostych słowach, ’String’ może reprezentować słowo, zdanie lub całestrony tekstu.

To co jest potrzebne nam w pierwszej fazie kursu to jedynie wiedza o tymjak stworzyć najprostszą klasę. Przykładowa klasa odpowiadająca Adresowi Za-mieszkania wyglądała by jak poniżej:

Page 22: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 4. PODSTAWY JĘZYKA JAVA 21

static class AdresZamieszkania{String miasto;String ulica;int numerDomu;int numerMieszkania;}

Znaczenie słowa static na razie przemilczymy.Aby użyć naszej funkcji wewnątrz funkcji ’main’ musimy

AdresZamieszkania adres = new AdresZamieszkania();adres.miasto="Łódź";adres.ulica="Piotrkowska";adres.numerDomu=1;adres.numerMieszkania=2;

Słowo ’new’ jest używane do tworzenia nowych obiektów o danym typie. Potemwidzimy, że dzięki operatorowi kropki mogliśmy nadać wartości zmiennym wpamięci.

4.1.5 I jeszcze o zmiennych

Omówmy jeszcze inne istniejące umowy dotyczące zmiennych w Javie. Nazwazmiennej może składać się z dużych i małych liter, cyfr i znaków podkreślenia.Nazwa nie może składać się zacząć się od cyfry, a rozmiar liter ma znaczenie(tzw. CASE SENSITIVE). Obowiązuje jednak umowa która obowiązuje mówi,że

1. Nazwa zmiennej ma być znacząca - czyli odpowiadać jej treści lub zasto-sowaniu

2. Powinna zaczynać się od małej litery

3. Nie powinna zawierać znaku podkreślenia

4. Jeśli składa się z kilku słów języka codziennego to pierwszą literę nowegosłowa (prócz pierwszego z tych słów) wyróżnia się dużą literą

Zatem dla zmiennej typu int przechowującej ilość wykonań licznika pętli dekla-racja powinna wyglądać następująco:

int iloscWykonanLicznikaPetli;

W tym dodam jeszcze uwagę. Każda linia wykonywalna (czyli prawie każda liniakodu prócz kilku wyjątków) musi być zakończona znakiem ’;’.

4.1.6 Słowa zarezerwowane

Jest też lista słów tzw. kluczowych lub zarezerwowanych, które nie mogą byćużyte jako nazwy zmiennych. Oto ich lista

abstract continue for new switchassert default if package synchronizedboolean do goto private this

Page 23: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 4. PODSTAWY JĘZYKA JAVA 22

break double implements protected throwbyte else import public throwscase enum instanceof return transientcatch extends int short trychar final interface static voidclass finally long strictfp volatileconst float native super while

4.1.7 Znaki niepisane

Problemem przy wypisywaniu jest gdy próbujemy wykonać coś co nie ma zna-ku literowego na klawiaturze. Wśród całej gamy znaków są bowiem znaki tzw.niepisane, które nie mają symbolu. Przykładem jest np. znak nowej linii. Ję-zyk Java rozwiązuje ten problem definiując te znaki z użyciem znaku ”\” jakosymbolu specjalnego mającego zapewnić odmienną interpretacje. I tak:

\n - oznacza znak nowej linii

\t - oznacza znak tabulacji.

\v - tabulacja pionowa

\a - alarm

\f - nowa strona

\b - backspace

\” - do obsługi klamer w wypisywaniu

\\ - do obsługi znaku \w wypisywaniu

4.1.8 Rzutowanie

Język Java podobnie do języka C/C++ pozwala w łatwy sposób rzutować zmien-ne na inne. Nie robi tego jednak tak często i chętnie jak swój poprzednik i wyma-ga by wprost pisać, że nastąpi rzutowanie. Nie każde rzutowanie jest poprawne(np. bitowo nie należy rzutować floata na int), a gdy się je stosuje czasem mimo,że nie jest to wymagane, warto zaznaczyć że miało miejsce rzutowanie. Przykładprostego rzutowania:

char literka = ’a’;int noLiterki = (int) literka;

4.1.9 Typ specjalny void

Spośród wszystkich typów typ void jest bardzo wyjątkowy. W wielu językachrozróżnia się procedury i funkcje. Przyjmuje się, że funkcja musi coś zwrócić,zaś procedura tego nie robi. W programowaniu jednak przyjmuje się zasadę, żejeśli pewne działanie nie musi niczego zwracać, to niech przynajmniej zwrócijakiś kod błędu lub jego braku. Dlatego funkcje w Javie zawsze coś muszą zwra-cać. Najbezpieczniej by był to typ int, jednak z czasem by wyróżnić ten typutworzono specjalny typ, który nie zawiera żadnych informacji nazwany typemvoid.

Page 24: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 4. PODSTAWY JĘZYKA JAVA 23

4.2 Podstawowe operacje w języku Java

Mając do dyspozycji podstawowe typy danych bylibyśmy w stanie napisać naj-prostsze programy o ile tylko znalibyśmy komendy jakie możemy wykonywać.Najogólniej pisząc to co można robić w każdym z języków programowania to są3 rzeczy

� Sprawdzać, przy pomocy instrukcji warunkowych

� Powtarzać, przy użyciu pętli

� Wykonywać zwarte bloki kodu, przy pomocy napisanych funkcji.

Omówmy je sobie kolejno:

4.2.1 Instrukcje warunkowe

Instrukcje warunkowe pozwalają określić przypadki w jakich określony kod mazostać wykonany. Podstawową instrukcja tutaj jest ’if’. Blok if wygląda nastę-pująco

if (/*warunek logiczny*/) {// ciąg instrukcji}

W odróżnieniu od C++ w Javie warunkiem w if może być wyłączanie ciąginstrukcji kończący się wartością logiczna czyli zmienną typu boolean. Warunekif może mieć również dwie poniższe postaci

if (/*warunek logiczny*/) {// ciąg instrukcji} else {// alternatywny ciąg instrukcji}

lub

if (/*warunek logiczny*/) {// ciąg instrukcji} else if (/* inny przypadek */) {// inny ciąg instrukcji} else {// alternatywny ciąg instrukcji}

Drugim typem instrukcji warunkowej jest instrukcja ’switch’. W przypadkuJavy instrukcja ta może jedynie działać dla zmiennych typu prymitywnego orazkilku innych nielicznych jak np. String czy typ wyliczeniowy.

int zmienna = 5;switch(zmienna){case 2:System.out.println("Zmienna wynosi 2");break;

Page 25: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 4. PODSTAWY JĘZYKA JAVA 24

case 3:case 4:System.out.println("Zmienna wynosi 3 lub 4");break;case 5:System.out.println("Zmienna wynosi 5");case 6:System.out.println("Zmienna wynosi 5 lub 6");break;default:System.out.println("Brak inne dopasowania - wybrano domyślne");}

Jak widać składa się ona z bloku poprzedzonego założeniem przełącznika (switch)dla zmiennej o identyfikatorze zmienna. Potem wymienione są przypadki (case)w których podane są wartości które tego przypadku dotyczą. Przetwarzane sąinstrukcje do czasu końca bloku lub wystąpieniu instrukcji przerywającej ’bre-ak’.

4.2.2 Instrukcje pętli

Drugą główną klasą komend są instrukcje pętli, służące do powtarzania okre-ślonej czynności aż do spełnienia pewnego warunku.

Najprostszym przykładem pętli w Javie jest pętla while o następującej kon-strukcji

while(warunek_logiczny){Ciąg instrukcji;}

Ciąg instrukcji jest wykonywany aż do momentu gdy warunek logiczny stanie sięfałszywy. Należy stosować ten typ pętli umiejętnie gdyż jest ona potencjalnienieskończona. W tym typie pętli, gdy warunek logiczny nie jest spełniony zapierwszym razem, blok instrukcji w pętli nie zostanie ani razu wykonany.

Innym typem prostej pętli jest pętla do-while postaci:

do {Ciąg instrukcji;}while(warunek_logiczny);

Która różni się od poprzedniczki tylko tym, że warunek jest sprawdzany po razpierwszy po wykonaniu pierwszej pętli.

Innym typem pętli jest pętla for, która jest najbogatszą z zaimplementowa-nych w znanych językach i posiada olbrzymie możliwości. Jej postać to:

for (Inicjalizacja;Warunek;Inkrementacja){Ciąg instrukcji;}

Inicjalizacja jest polem, gdzie tworzone są np. liczniki dla pętli. Warunek jest jakmożna by się spodziewać warunkiem na wyjście, przy czym szczególnie polecanesą warunki logiczne z > lub <. Pole inkrementacji (przyrostu) jest polem gdzieopisuje się jak zmieniać się powinny pewne elementy np licznik. Przyjrzyjmy sięprzykładowi, kodu sumującego elementy tablicy za pomocą pętli for:

Page 26: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 4. PODSTAWY JĘZYKA JAVA 25

int[] tablica = {1,2,3,4,5,6,7,8,9};int n = 9;int sum =0;for (int i=0; i < n; i++) {Ciąg instrukcji;}

Uwaga! Istnieje jeszcze jedna wersja pętli. Jest to pętla foreach, podobna dofor ale z uwagi na to że jej konstrukcja, nie jest ani niezbędna do nauki podstaworaz wymagana jest wiedza z zakresu kolekcji Java zostanie ona omówiona wdalszym miejscu lub pominięta w całości tego dokumentu.

W pętlach można wykonać pewne dodatkowe polecenia.

break - powoduje przerwanie wykonania bieżącej pętli i wyjście z niej. Należyuważać, gdyż pozwala to na opuszczenie jedynie najbardziej wewnętrznejpętli.

continue - jest ciekawszą instrukcją. Powoduje natychmiastowe przerwanie bie-żącej pętli i przejście do następnej pętli. Jest to zwłaszcza wymagane gdypewna operacja (np. dzielenie przez 0) powinna być pominięta.

4.2.3 Funkcje

Choć to instrukcje warunkowe i pętle zapewniają wszystko co potrzebne w no-woczesnym programowaniu to jednak przez większość czasu programista pisze iużywa funkcji. Do czego służą nam funkcje

� Grupują często powtarzający się fragment kodu

� Grupują część instrukcji, która stanowią jedną spójną logicznie całość

W przypadku grupowania często powtarzalnego kodu, łączenie ich w jed-ną funkcję pozwala nam zaoszczędzić miejsca w pamięci kosztem nieznaczniewiększej liczby operacji do wykonania.

Istotniejsza dla programisty jest druga zasada. Pozwala ona bowiem stwo-rzyć elegancki abstrakcyjny model wszystkiego. Często jest tak, że wykonującjakąś czynność nie myślimy o podstawowych czynnościach które się na nie skła-dają. Gdy prosimy o zgięcie ręki kogoś. To nie myślimy wcale o mięśniach którepo kolej mu zginać by to się stało. Te działania są przed nami ukryte za kotarąpewnego poziomu abstrakcji. Utrzymywanie kodu na jednym poziomie abstrak-cji jest jednym z zadań programisty.

Do rzeczy, czyli jak w Javie tworzymy funkcje. Otóż funkcje w Javie wolnonam tworzyć w obrębie jakieś klasy. Na początku będzie to nasza klasa główna.Każda funkcja musi mieć podany typ zwracany i musi być zwrócony dokładniejeden. Funkcja może też przyjąć dowolną, ale określoną ilość danych wejścio-wych.

void funkcja(int a, float b, String c){instrukcje;}

funkcja może być poprzedzona słowem kluczowym static lub nie. Słowo klu-czowe static określa czy dana część klasy należy bardziej do jej obiektów czy też

Page 27: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 4. PODSTAWY JĘZYKA JAVA 26

do samej klasy. Na przykład: każdy obiekt typu samolot posiada funkcję latania,ale opisanie zasady latania tyczy się samej klasy samolotów a każdego z nich zosobna. Słowem ’static’ wyróżnia się te funkcje, do użycia których nie potrzebaobiektów tego typu (nie potrzebujemy mieć samolotu pod ręką by mówić o tymw jaki sposób on lata, albo ile dany rodzaj samolotu pali).

4.3 Operatory

Specjalną grupę możliwości w programowaniu otwierane są przez tak zwaneoperatory. Najogólniej można by powiedzieć, że operatory są szczególnym przy-padkiem funkcji, działają powiem na operandach i produkują wynik. I faktyczniew C++ można było je dokładnie w tenże sposób traktować. W przypadku Javyjedna ważna rzecz zmieniła się. W języku Java nie można definiować nowychoperatorów. Postaramy się teraz omówić najważniejszej operatory występującew Javie.

Operator przypisania = jest najważniejszym operatorem w językach progra-mowania. Jest prawostronnie łączny i jego lewej stronie musi zawsze wy-stępować zmienna lub referencja. Jest to jego jedyna funkcja w Javie, niemożna go przeciążyć i jest domyślnie generowany dla wszystkich klas.

Operatory arytmetyczne jest również cała gama operatorów matematycz-nych, które służą prostym operacjom na liczbach. Często są też w litera-turze mylnie nazywane matematycznymi

Operatory logiczne służące do porównań oraz do operacji na wyrażeniachlogicznych

Operatory rzutowania służące do zamiany zmiennej na inną

Operator trójargumentowy służący do szybkiej inicjalizacji warunkowej

Operatory obiektowe operatory służące do pracy z obiektami

W przypadku Javy operatory są dostępne niemal wyłącznie dla typów prymi-tywnych. Jedynym wyjątkiem jest klasa String, gdzie działa operator dodawaniapełniąc rolę konkatenacji.

Lista operatorów:

= - przypisanie,+ - dodawania,- - odejmowanie,* - mnożenie,/ - dzielenie,% - dzielenie modulo ,++ - zwiększenie o 1,-- - zmniejszenie o 1,+=,-=,*=,/=,%=, jak wyżej ale zapisanie wyniku następujedo zmiennej podanej po lewej stronie operatora> - większe od,>= - większe lub równe od,< - mniejsze od,

Page 28: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 4. PODSTAWY JĘZYKA JAVA 27

<= - mniejsze lub równe od,== - równe,!= - nierówne,! - zaprzeczenie logiczne,&& - i logiczne leniwe ,|| - lub logiczne leniwe,& - i logiczne lub i bitowe ,| - lub logiczne leniwe lub lub bitowe,~ - negacja bitowa,^ - alternatywa wykluczająca bitowa,&=,|=,^= - ja wyżej ale z przypisaniem,<< - bitowe przesunięcie w lewo,>> - bitowe przesunięcie w prawo ze znakiem,>>> - bitowe przesunięcie w prawo bez znaku<<=,>>=, >>>= - jak wyżej ale z przypisaniemnew operator wywołania konstruktora. - operator dostępu(cast) - operator rzutowania? : - operator potrójny

Kilka faktów dotyczących powyższych operatorów

� Operatory ++ oraz −− w odróżnieniu od C++, występują jedynie w pra-wostronnej wersji (operand stoi po prawo). Służą do zwiększania/zmniejszaniawartości liczby całkowitej o 1.

� Operatory leniwe logiczne wyróżniają się tym od od zwykłych, że nie war-tościują niepotrzebnie wyrażenia. Np. gdy pierwsze w ’lub’ jest prawdziwelub fałszywe dla ’i’. Pozwala to uniknąć potencjalnie wielu błędów

String s;...if (s==null || s.isEmpty()){...}

przy lub zwykłym dla ’s’ pustego uzyskany by był błąd dostępu

� Operatory bitowe operują na bitowej postaci liczby. Działają po pozycjachwg zasady że 1 - oznacza prawdę a 0 fałsz.

� Operatory przesunięcia za swój prawy argument przyjmują liczbę typucałkowite o ilości miejsc przesunięcia. Operator << powoduje przesunięciew lewo przy jednoczesnym dopełnieniu zerami z prawej strony. Operator>>> działa podobnie z zaznaczeniem dopełniania zerami od strony pra-wej. Operator >> jest przesunięciem ze znakiem gdyż dla liczb dodatnich(0 na pierwszym bicie) uzupełnia je od lewej zerami, zaś dla ujemnych (1na pierwszym bicie) uzupełnia je jedynkami.

� Operator rzutowania pozwala zmieniać jeden typ prymitywny na drugi.Np

int i = (char) ’c’;

Page 29: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 4. PODSTAWY JĘZYKA JAVA 28

W tej zasadzie działania operator ten działa jedynie dla typów prymityw-nych. Dla obiektowych jest to operator reinterpretacji referencji. Chodzitu o patrzenie na otrzymaną referencję typu ogólnego jako na referencjetypu szczególnego

KlasaOgolna ko = new KlasaSzczegolna(); // ko ma cechy klasy ogolnejKlasaSzczegolna ks = (KlasaSzczegolna) ko; //ks ma juz spowrotem//wszystkie cechy obiektuKlasaOgolna ko2 = new KlasaOgolna();KlasaSzczegolna ks2 = (KlasaSzczegolna) ko2; // błąd rzutowania

� Operator trójargumentowy służy do szybkiej inicjalizacji zmiennych. Jegokonstrukcja to

warunek_logiczny?wartosc1:wartosc2

wartosc1 jest nadawana zmiennej przy warunku prawdziwym, zaś wartosc2w przypadku przeciwnym.

boolean czyMniejsza = true;int i = czyMniejsza?3:5; //zwraca 3 gdy ma być mniejsza,//5 w przeciwnym wypadku

� Operator new służy do sygnalizacji użycia konstruktora czyli tworzenianowej zmiennej w pamięci

String text = new String("Jakis tekst");

Operatora tego używa się wyłącznie do tworzenia obiektów, w szczególno-ści tablic, nigdy do typów prymitywnych.

// tablica 4 elementowaint[] tab = new int[4];int[] tab2 = new int[]{3,4,5};String[] str = new String[5];String[] str2 = new String[]{new String("raz"),new String("dwa")};

� Operator . służy do wywołania zasobów dla dowolnego obiektu. Jedynietypy prymitywne nie posiadają dostępu przez ten operator. Operator tenmoże być również wywoływany na rzecz klasy i wtedy oferuje zasoby po-siadane przez klasę.

4.3.1 Literały

Istnieją również inne specjalne znaki w kodzie, które operatorami co prawda niesą, ale ich funkcje są w pewien sposób szczególne. Nazywa się je często literałami.Odpowiadają one potrzebom takim jak:

� Podać liczbę w sposób ósemkowy, szesnastkowy.

Page 30: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 4. PODSTAWY JĘZYKA JAVA 29

� Podać liczbę całkowitą długą (long)

� Podać liczbę typu float

� Podać liczbę z notacji wykładniczej

Aby zapisać liczbę w sposób ósemkowy wystarczy dopisać zero na początkuliczby, natomiast dla szesnastkowego należy dodać literał 0x lub 0X

int i = 010; // odpowiada 8int j = 0x0F; //odpowiada 15

Aby zapisać liczbę długą używa się specjalnego postfixowego literału. Podobnieby zaznaczyć że liczba jest typu float lub dla double (tu jest niepotrzebne, aleczasami dla przejrzystości)

long i = 16666L;float f = 3.14f;double d = 3.1415d;

Aby zapisać liczbę w notacji wykładniczej piszemy:

float f = 1e-10f;

Wielkość liter w literałach nie ma znaczenia.

4.4 Obsługa błędów w języku Java

Oczekuje się, że napisany przez programistę program będzie niezawodny. Tym-czasem zdarzają się sytuacje, gdy nie z winy samego programu, ten nie możebyć poprawnie wykonany. Np. program ma sprawdzić w internecie notowaniajakiś walut. Tymczasem nie działa sieć internet. Zauważyliśmy, już że programy(funkcje) kończą się wraz z wykonaniem instrukcji zakończenia i zwrotu ’return’.Jednak funkcja która miała za zadanie odszukać wycenę danej waluty, nie speł-niła swojej funkcji w skutek przeszkód. Zwrócenie jakieś przypadkowej wartościnie rozwiązuje naszego problemu. Zależy nam bowiem na informacji, że naszafunkcja nie ukończyła swojego działania w sposób planowany.

W przypadku języka Java problem ten rozwiązano w sposób następujący.Istnieje specjalna podgrupa obiektów, które nazywane są wyjątkami. Nadrzęd-na wśród nich jest ”java.lang.Exception”. Najpierw wyjaśnijmy sobie jakie sązasady tworzenia wyjątków, a potem jak w kodzie przebiega obsługiwanie rzeczyz nimi związanych.

4.4.1 Drzewo hierarchii błędów

Dowiedzieliśmy się właśnie, że do obsługi błędów w Javie używa jest klasaException z pakietu java.lang. Gdybyśmy jednak używali tylko tej klasy szybkobyśmy zgubili się w tym co one tak naprawdę oznaczają i co gorsza nie byłobynam łatwo ich rozróżniać.

Postaramy się omówić zasadę tworzenie drzewa hierarchii błędów na pod-stawie przykładu. Kupiliśmy używany samochód, a te jak wiadomo się psują.Oznacza to, że dopuszczamy możliwość błędu dotyczącego całego samochodu.

Page 31: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 4. PODSTAWY JĘZYKA JAVA 30

class SamochodException extends Exception {...}

W samochodzie może się jednak zepsuć wiele rzeczy i od rodzaju tej awariimoże zależeć np. rodzaj mechanika, do którego się udamy. Np awaria silnika czyuszkodzenie lakieru

class AwariaSilnikaException extends SamochodException {...}class UszkodzenieLakieruException extends SamochodException {...}

Z kolei rodzajem awarii silnika może być problem z zapłonem silnika. Z koleirodzajem awarii zapłonu może być zniszczona świeca itd. Przykładem oddają-cym sens takiego hierarchicznego układania wyjątków zostaje dostrzeżony gdypojawiłby się wyjątek Nieudało Się Uruchomić Samochodu Exception. Gdybybył to jeden z wielu wyjątków typu Exception to od razu udawalibyśmy się domechanika. Tymczasem przy pojawieniu się tego wyjątku każdy by po prostuspróbował ponownie uruchomić silnik, i dopiero po wielu nieudanych próbachudałby się do mechanika z problemem.

4.4.2 Komendy obsługi błędów

W Javie występuje kilka komend pozwalających nam na obsługę błędów.

throw jest komendą służącą do uruchomienia sytuacji wyjątkowej określonegotypu.

Samochod s = new Samochod();s.odpalSilnik();if (s.czySilnikWylaczony) {throw new NieUruchomionoSilnikaException("Silnik nie pracuje "++"pomimo, że próbowano go uruchomić");

}

W chwili wykonania komendy ’throw’ przerywana jest dotychczasowa pra-ca i zgłaszany jest problem. Problem przerywa działania kolejnych funkcji,aż do odnalezienia obszaru, który rozwiązuje jego problem. Jeśli takiegonie znajdzie, program przerywa całkowicie swoje działanie.

try jest komendą tworzącą blok obejmującą ’wadliwy kod’. Nie występuje sa-motnie. Zawsze musi być przy niej co najmniej jeden blok obsługi, lubblok zamykający.

catch jest komendą tworzącą blok obsługi. Musi być poprzedzone blokiem obej-mującym lub innym blokiem obsługi.

Samochod s = new Samochod();try {s.uruchomSilnik();} catch(KluczykNiePasujeDoStacyjkiException ex){...}catch(BrakPaliwaException ex){...}catch(AwariaRozrusznikaException ex{...}catch(SamochodException ex){...}

Page 32: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 4. PODSTAWY JĘZYKA JAVA 31

Jeśli występuje wiele bloków obsługi powinny być one poukładane w ko-lejności od najbardziej szczegółowych do najbardziej ogólnych. Wykonanyzostanie bowiem pierwszy blok do którego pasuje rozpatrzony problem.Jeśli napisalibyśmy kod

Samochod s = new Samochod();try {s.uruchomSilnik();} catch(SamochodException ex){...}catch(KluczykNiePasujeDoStacyjkiException ex){...}catch(BrakPaliwaException ex){...}catch(AwariaRozrusznikaException ex{...}

To zawsze wykonywałby się jedynie blok dla SamochodException, gdyżnp. KlyczykNiePasujeDoStacyjkiException jest podtypem SamochodE-xception.

finally jest komendą tworzącą blok zamykający. Jest to fragment kodu, którywykonuje się zawsze, nie zależnie od tego czy ’wadliwy kod’ spowodowałbłąd czy też nie. Stosujemy go głównie do tego by przed zgłoszeniem wy-jątku uprzątnąć pewne rzeczy. Blok występuje po ostatnim bloku obsługi,lub bezpośrednio po bloku obejmującym

Samochod s = new Samochod();try {s.uruchomSilnik();}catch(KluczykNiePasujeDoStacyjkiException ex){...}catch(BrakPaliwaException ex){...}catch(AwariaRozrusznikaException ex{...}catch(SamochodException ex){...}finally {s.zaciagnijHamulec();s.wysiadź();s.zamknijSamochod();}

throws W przypadku kiedy dany błąd może wystąpić w funkcji dołącza się doniej informacje, o tym że dany wyjątek może być powodowany.

void uruchomSilnik() throws KluczykNiePasujeDoStacyjkiException, BrakPaliwaException, AwariaRozrusznikaException, ZerwanaLinkaGaźnikaException;

Informacja ta występuje wtedy, gdy z danym błędem nie radzi sobie (np.ponieważ nie powinna tego robić) w jej wnętrzu funkcja.

class Elektryk {void napraw(Samochod s) throws AwariaSilnikaException{try {s.uruchomAuto();} catch(PadniętyAkumulatorException ex){

Page 33: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 4. PODSTAWY JĘZYKA JAVA 32

wymień(s,new Akumulator());}

}

} //class Elektryk

Widać, że o ile elektryk umie naprawić Padnięty Akumulator o tyle nieporadzi sobie z uszkodzony silnikiem i pracę nad jego naprawą trzebaprzekazać komuś innemu.

Na tym kończymy omawianie wyjątków w Javie. Zauważamy jeszcze jednąrzecz. Wszystkie klasy błędów, zwykło się zakończać słowem Exception. Popra-wia to czytelność kodu i upewnia nas, że dany obiekt jest rodzajem wyjątku.

4.5 Inne reguły w języka Java

W tej części wymienimy inne ważne elementy dotyczące podstaw języka Java

4.5.1 Nazewnictwo w Javie

Wiemy już, że nazwy własne w Javie mogą być napisane z użyciem dużych jaki małych liter. Przyjmuje się następujące umowy:

� Wszystkie nazwy zmiennych zaczynają się małą literą.

Page 34: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Rozdział 5

Tworzenie modeli w Javie

Po poznaniu podstawy programowania w Java, następnym krokiem jest zrozu-mienia modelowania obiektowego. Czym zajmuje się modelowanie obiektowe?Otóż, jak widać w świecie rzeczywistym, występują różne twory różnych typównp. psy, koty, ludzie, kamienie, itd. Twory te posiadają pewne cechy, które należądo 1 z 3 grup: charakterystyk, umiejętności i relacji. Przykładem charakterystykijest waga człowieka. Każdy człowiek ma jakąś wagę, która jest dokładnie niemuprzypisana. Przykładem umiejętności np. chodzenie. Przykładem relacji jest dlaczłowieka bycie ssakiem i posiadanie cech ssakowi przypisanym. Modelowaniestara się rozpoznać te 3 grupy cech i oddać zasadę ich pracy za pomocą pól,funkcji oraz dziedziczeń. Sprowadza się to do utworzenia nowe rodzaju danych,które mają przybliżyć złożoność konstrukcji danego tworu. Wszelkie abstraktyistniejące w świecie są oddawane za pomocą typu danych jakim jest klasa, na-tomiast twory pasujące do danego abstraktu są oddawane za pomocą obiektupewnej klasy.

Mówiąc na przykładach, jeśli chcielibyśmy w programie stworzyć Reksia,potrzebujemy najpierw opisać abstrakt psa:

� Jakie są jego cechy? (Jak się wabi, kiedy się urodził, kto jest jego opieku-nem, czy był szczepiony)

� Jakie są jego umiejętności? (Czy aportuje, je, chodzi, szczeka)

� Gdzie znajduje się jego miejsce w hierarchii (Pies - Psowate - Ssaki -Zwierzęta)

. A w dalszej kolejności należy podać cechy jakie posiada Reksio w kwestii byciapsem.

5.1 Tworzenie nowej klasy

Dowiedzieliśmy się już, że celem zamodelowania nowego obiektu należy utworzyćnową klasę. Do tej pory używaliśmy do tworzenia klasy konstrukcji statycznejktóra pozwalała nam tworzyć klasę w klasie. Po prawdzie używamy metody,której sensu i działania jeszcze nie rozumiemy i która jest daleka od tej naj-prostszej. Otóż, nową klasę tworzymy w nowym pliku. Klikając PPM na paczceoprogramowania w oknie widoku projektu i wybierając nową ”java class”. Tam

33

Page 35: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 5. TWORZENIE MODELI W JAVIE 34

podajemy nazwę klasy i klasa zostaje automatycznie wygenerowana i pojawiasię w widoku projektu. Dla ustalenia uwagi przyjmijmy, że tworzymy nową klasęprocesor

package modelowanie;

/**** @author Piotr Kowalski*/public class Procesor {

}

W tak stworzonym pliku możemy zamodelować dowolny istniejący obiekt. Zelementów które znamy wymienić i przypomnieć warto:

pola oddające charakter cechy lub składowej elementu. np taktowanie proce-sora jako int, nazwa procesora jako String czy podobne

pola statyczne pola dotyczące procesorów ogólnie, jak np data wypuszczeniaprocesora na rynek

metody funkcje, która dany obiekt potrafi wykonywać. Np. każdy procesorumie dodawać dwie liczby

int add(int a,int b)

metody statyczne funkcje, do użycia których nie potrzebny jest obiekt pro-cesora np. przeliczyć taktowanie na ilość operacji na sekundę.

Teraz powiemy sobie o kolejnych możliwościach:

5.2 Dziedziczenie i polimorfizm

Okazuje się, że dziedziczenie jest już czymś co zdążyliśmy po części pokazaćprzy okazji pokazania obsługi błędów. Powiedzmy sobie teraz jeszcze raz i ogól-niej. W przyrodzie istnieją w sposób naturalny związki pomiędzy obiektamiróżnych rodzajów. Można się doszukiwać w tym użycia matematycznej zasadyabstrakcji, lub zwykłego nazywania podobieństw. I tak człowiek jest ssakiem,ssak zwierzęciem, zwierzę istotą żywą. Oznacza to że człowiekowi przypisanesą wszystkie cechy zarówno ssaka co i zwierzęcia co i istoty żywej. Podobniewszystko co potrafi abstrakcyjne zwierzę, potrafi i człowiek (np. jeść czy pić).Języki programowania starają się oddać naturę tego związku.

Chcąc napisać że dany typ (czyli klasa) dziedziczy inny typ piszemy

class A extends B {}

Oznacza to, że wszystko co cechuje klasę B wyląduje w klasie A. Okazuje się jed-nak, że dziedziczenie w ten sposób może być wykonane tylko jeden raz. Ponadtopisząc

class A {}

Page 36: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 5. TWORZENIE MODELI W JAVIE 35

tak naprawdę piszemy

class A extends Object {}

Czyli wszystkie klasy (prócz Object) w którymś momencie dziedziczą klasę Ob-ject, nadrzędną wszystkich klas. W efekcie okazuje się, że klasy tworzą strukturędrzewa skierowanego z Objectem jako korzeniem.

Możliwość dziedziczenia jedynie po jednej klasie sprawia nam duży kłopotprzy tworzeniu ciekawszych typów. Często przywoływanym jest przykład amfi-bii, która jednocześnie jest samochodem co statkiem. Jako że nie może odziedzi-czyć jednocześnie po statku i samochodzie to oznacza, że należy wykonać mo-delowanie w inny sposób. Twórcy języka Java, chcieli nas w ten sposób ustrzecprzed problemem podwójnego odziedziczenia pewnych rzeczy. I samochód i sta-tek dziedziczą prawdopodobnie pojazd. Czy w takim układzie amfibia powinnamieć te pola pochodzące od pojazdu podwójnie? Czy jeśli będą pojedynczo tofunkcje samochodu i amfibii będą dalej dobrze działać? Jak w takim układzieuzyskiwać do nich dostęp? Skąd programista ma wiedzieć czy taki konflikt siępojawi?

Okazuje się Java pozwala na dziedziczeniu wielu klas jednak jedynie na spe-cjalnych zasadach. Okazuje się, że jedynie specjalna część klas może zostać odzie-dziczona dodatkowo. Klasy te nazywane są interfejsami.

5.2.1 Interfejsy

Interfejsy stanowią specjalną podrodzinę klas. Nałożone są na nie specjalne iduże ograniczenia, które w efekcie pozwalają uniknąć problemów wielokrotnegodziedziczenia. Definiuje się również w specjalny sposób. Przy tworzeniu nowegointerfejsu w Netbeans zamiast new Java Class wybieramy new Java Interface.

/**** @author Piotr Kowalski*/public interface Interfejs {

}

Omówmy cechy, które posiadają interfejsy

� Interfejs może dziedziczyć tylko inny interfejs, niewolno nam jednak w tejimplementacji się zapętlić.

� Wszystkie pola w interfejsach są traktowane jako stałe i statyczne.

� Wszystkie metody muszą być poprzedzone przez modyfikator ’abstract’ inie posiadać wnętrza (sama definicja)

Aby użyć interfejsu w tworzeniu nowej klasy wykonujemy dziedziczenie innymsłowem kluczowym

class A implements InterfejsB {}

Często w takim układzie nazywa się te dwa typy dziedziczenia rozszerzaniemi implementacją. Aby lepiej zrozumieć zasadę działania interfejsów przytoczmyprzykład. Przyjmijmy, że

Page 37: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 5. TWORZENIE MODELI W JAVIE 36

class Syn extends Ojciec{}

czyli Ojciec przekazał synowi całą swoją wiedzę i umiejętności. Nikt nie odbierzeojcu jego prawa ojcowskiego. Jedna Syn mógł otrzymać również umiejętnościpochodzące skądinąd. Np. jazdy na rowerze nauczył go wujek. I tak

class Syn extends Ojciec implements Wujek,Szkoła,Studia {}

Syn otrzymuje dodatkowe umiejętności. Przykład choć nie oddaje klasyczniecharakteru dziedziczenia, wprawnie oddaje rolę interfejsu. Chodzi w skrócie oto by przekazać informację o tym, że pewne obiekty potrafią wykonywać okre-ślone czynności. Weźmy np. umiejętność grania. Na czym można grać. Np nainstrumentach muzycznych. Ale grać można również na komputerze czy czasa-mi na czyiś nerwach. Instrument i komputer dziedziczą co prawda po wspólnejklasie przedmiot, jednakże nie na każdym przedmiocie można grać.

interface IMoznaGracNa {abstract public void grajNa();}class InstrumentMuzyczny implements IMoznaGracNa {@Overridepublic void grajNa(){}}class Komputer implements IMoznaGracNa {@Overridepublic void grajNa(){}}

W efekcie czego i klasa InstrumentMuzyczny i Komputer pozwalają na granie.Całkiem nową zalecą modą jest rozpoczynanie nazwy interfejsu od wielkiej literyI. Moda ta pochodzi z języka C# ale zdaje się mieć coraz więcej popleczników.Pozostaje zatem wyjaśnić czym jest ’abstract’ i ’@Override’.

5.2.2 Modyfikator ’abstract’ i adnotacja ’@Override’

Słowo kluczowe ’abstract’ jest narzędziem do realizacji pojęcia tzw. polimorfi-zmu czyli wielu postaci kodu. Jaka jest ogólna idea ukryta za tajemniczym poli-morfizmem. Wyobraźmy sobie, że mamy gromadę różnych zwierzątek. Wszyst-kie te zwierzątka doskonale rozumieją polecenie ’idź tam’. Zauważmy jednak,że ’idź tam’ papugi, węża, psa i małpki znacząco się będzie różnić. Pomimo,że to ’idź tam’ jest jednakowe w użyciu to każde z zwierzątek wykona je naswój typowy sposób, papuga poleci, wąż popełźnie, pies poczłapie na czterechłapkach, a małpka na dwóch.

Tłumacząc na to na języki programowania. Wszystkie klasy Papuga, Wąż,Pies, Małpa posiadają metodę ’idź tam’. Jednak każde z tych metod jest wyko-nywana przez ciut inny ciąg instrukcji czyli jest innym kodem. Skoro instrukcja’idź tam’ używa się tak samo to jest jedna jednak wykonuje w wielu postaciach(poli-morfizm wiele postaci).

Cel c = new Cel();Pies pies = new Pies();Papuga papuga =new Papuga();

Page 38: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 5. TWORZENIE MODELI W JAVIE 37

Waz waz = new Waz();Malpa malpa = new Malpa();pies.idzTam(c);papuga.idzTam(c);waz.idzTam(c);malpa.idzTam(c);

Czyli widać, że pod jedną nazwą może ukrywać się wiele różnych działań. Praw-dziwa moc tej konstrukcji, ujawnia się dopiero gdy użyjemy rzutowań. Obiektybowiem same pamiętają na czym polega ich funkcja

...Zwierzeta[] gromadaZwierzat = new Zwierzeta[]{pies,papuga,waz,malpa};for (int i =0; i< gromadaZwierzat.length;i++){gromadaZwierzat[i].idzTam(c);}

Do realizacji tego wykorzystujemy właśnie duet słowa kluczowe ’abstract’ iadnotację ’@Override’. Aby zrealizować powyższe wystarczy, że klasa Zwierzetazasygnalizuje, że ona i jej klasy potomne będzie używać takiej funkcji jak idzTam

abstract class Zwierzeta {

abstract void idzTam(Cel c);}class Pies extends Zwierzeta{@Overridevoid idzTam(Cel c){/*idzie na 4 łapach*/};}class Papuga extends Zwierzeta{@Overridevoid idzTam(Cel c){/*leci*/};}class Waz extends Zwierzeta{@Overridevoid idzTam(Cel c){/*pelza*/};}class Malpa extends Zwierzeta{@Overridevoid idzTam(Cel c){/*idzie na 2 nogach*/};}

Dodatkowo klasa zwykła, która posiada co najmniej jedną metodę abstrak-cyjną musi być poprzedzona słowem abstract. Klasę taką nazywa się abstrakcyj-ną (chyba że mamy do czynienia z interfejsem, który zawsze jest abstrakcyjny)i nie można utworzyć obiektu takiej klasy.

5.3 Modyfikatory dostępu

Poznaliśmy już słowo kluczowe ’abstract’ które zmodyfikowało funkcje na funk-cję polimorficzną. Poznamy jeszcze tzw. modyfikatory dostępu.

Page 39: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 5. TWORZENIE MODELI W JAVIE 38

Jaka jest idea zasięgu dostępu. Domyślnie jeśli klasa posiada jakąś funkcjęczy zmienną bez modyfikacji to w każdym miejscu w danym pakiecie oprogramo-wania można uzyskać do niej dostęp. Nazywane jest to dostępem pakietowym.A ten może być zmodyfikowany przez jeden z 3 poniższych modyfikatorów

public - dostęp publiczny - poprzedzając klasę, funkcję czy zmienną czyni jąwidzialną w dowolnym oprogramowaniu Javy, która uzyskuje do niegodostęp

private - dostęp prywatny - poprzedzając klasę, funkcję czy zmienna czyni jąniewidzialną dla dowolnego spoza danego pliku. Służy do ukrywania tegoco nie powinno być zobaczone przez nikogo

protected - dostęp chroniony - działa tak jak private z tą jedyną różnicą, żewszystkie klasy dziedziczące daną również mogą uzyskać do niej dostęp.

Poznanie wszelkich wyników kombinacji poszczególnych modyfikatorów zaj-muje dużo czasu. Dlatego w tym miejscu wymieńmy jedynie kilka reguł

� Wszystkie pola w klasie powinny być protected, a w szczególnych przy-padkach private.

� Klasy są z reguły prywatne i potrzeba klas prywatnych i chronionych zda-rza się w praktyce niezwykle rzadko. Klasy takie są klasami wewnętrznymi

� Można stworzyć klasę nieabstrakcyjną, której obiektów nie będzie moż-na tworzyć. Wystarczy przy wszystkich konstruktorach dać modyfikatorprotected lub private

� Metody podane w interfejsach są z reguły publiczne. Nigdy prywatne.Niemal nigdy chronione.

� Klasa, która może być odziedziczona powinna mieć co najmniej jeden kon-struktor co najmniej chroniony

Modyfikatory dostępu bez problemu łączą się ze słowem kluczowym ’static’.

5.3.1 Modyfikator ’final’

Z pewnych względów może nam zależeć aby pewne fragmenty kodu były nie-zmienne niezależnie od tego co się z nimi potem ma dziać. W języku Java dowymuszania niezmienności używane jest specjalne( i po raz pierwszy pojawiają-ce się właśnie w tym języku) słowo final. W zależności od tego co modyfikujemyużyciem tego słowa kluczowego otrzymamy różne efekty.

Zmienne finalne oraz zmienne statyczne finalne

Słowo final jest często (nie do końca słusznie) traktowane jako nowy sposóbtworzenia stałych na zasadach modyfikatora const z języka C++. O ile w przy-padku typów prymitywnych działanie to ma właśnie takie zastosowanie o tylew przypadku reszty czyli typów referencyjnych zastosowanie jest zupełnie in-ne. Operator final w zasadzie wyklucza jedynie możliwość wywołania operatoraprzypisania na obiekcie który jest nim zmodyfikowany. Oznacza to że posiadającfinalną referencje do tablicy, jej elementy nie są chronione przed jakimikolwiek

Page 40: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 5. TWORZENIE MODELI W JAVIE 39

zmianami, a jedynie uniemożliwione jest wstawienie innego obiektu danego ty-pu pod tą samą referencję. Identyczna zasada dotyczy się zmiennych, które sądodatkowe modyfikowane poprzez słowo kluczowe ’static’.

Puste zmienne finalne

Możliwe jest tworzenie zmiennych finalnych bez natychmiastowego określaniaich wartości. Zmienne te oczekiwać będą na ustawienie na wartość początko-wą w późniejszym fragmencie kodu i dopiero tą przypisaną wartość/referencjępotraktują jako niezmienną.

Finalne argumenty

Jeśli argument w funkcji jest podany jako finalny, to podobnie jak przy defi-nicji zmiennej, nie jest możliwe wywołanie na nim operatora przypisania. Wzakresie działania funkcji wartość nie może być zmieniona, natomiast referencjaprzestawiona na inny obiekt.

Metody finalne

W związku z wymaganiami projektowymi, możliwe jest tworzenie metod (funk-cji) będących finalnymi. Oznacza to, że żadna z klas dziedziczących tę metodęnie może zmienić jej kodu. Wyobraźmy sobie, że napisaliśmy funkcję czyHasło-Prawdziwe, która sprawdza czy użytkownik podał prawdziwe hasło. Jeśli metodata nie byłaby finalna, inny użytkownik mógł odziedziczyć naszą klasę i napisaćnową funkcję np. taką jak poniżej

@Overrideboolean czyHasloPrawdziwe(Uzytkownicy user, String hasło){return true;}

W który to sposób uzyskał by dostęp do zasobów bez podania poprawnegohasła.

Ponadto funkcje, które wykonują się bardzo krótko (z reguły jednolinijkowe)oznacza się jako finalne, aby przyśpieszyć ich wykonywanie.

Warto też odnotować, że wszystkie funkcje prywatne są również finalne. Nieprzynosi żadnego efektu łączenie tych dwóch słów kluczowych.

Klasy finalne

W odniesieniu do problemu, który motywuje istnienie metod finalnych, możnapójść krok dalej i zabronić nie nadpisania funkcji, ale w jej dziedziczenia w ogóle.Klasy finalne nie mogą zostać odziedziczone.

5.4 Słowo kluczowe ’this’ oraz o konstruktorach

W końcu działu o tworzeniu modeli w języku Java opowiemy sobie o meto-dach konstruowania obiektów. Zacznijmy jednak od tajemniczej referencji this.Słowa kluczowego this możemy używać w dowolnej niestatycznej metodzie aby

Page 41: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 5. TWORZENIE MODELI W JAVIE 40

odwoływać się do obiektu na rzecz którego wywoływana jest funkcja. Jest onaprzydatna, głównie po to by nie mylić nazw.

Do rzeczy o konstruktorach. Obiekty z punktu widzenia komputera są tylkoobszarami w pamięci. Mogą być zatem zajmowane i zwalniane. Okres od zajęciado zwolnienia nazywa się czasem istnienia obiektu. Obiekty są zwalniane auto-matycznie przez jvm, gdy program zgubi wszystkie referencje do niej. Tworzenieich jednak występuje jedynie na życzenie programisty.

Konstruktor ze swojej pisowni przypomina zwykłą funkcję, jednak różnicew jego pisowni są dość znaczne.

� Konstruktor nie zwraca żadnego typu. Nawet typu ’void’

� Nazywa się tak jak klasa którą ma tworzyć. Jest to zatem jedyna funkcjapisana z dużej litery.

� Nie używamy ’return’ w jego wnętrzu.

public NowaKlasa(){

}

Java w odróżnieniu od C++ pozwala nam używać innych konstruktorów.Spełnione muszą być jednak pewne istotne warunki:

� Użycie konstruktora musi wystąpić w pierwszej linijce kodu

� nie wolno wywoływać w tej linijce żadnych funkcji

public NowaKlasa(Strins s){this.nazwa = s;}public NowaKlasa(){this("domyslna"); // wywolanie innego konstruktora}

Musi to być pierwsza linijka kodu z uwagi na to jak w Javie tworzone sąobiekty

1. Tworzone są pola i metody nadklasy po której dziedziczymy

2. Tworzone są pola i metody klasy

3. Rozpoczyna się kod konstruktora

Dwie pierwsze czynności są robione automatycznie. Więc gdy chcemy użyć in-nego konstruktora, musimy wyraźnie od razu napisać by to tamten konstruktorzajął się generowaniem nadklasy oraz pól i metod. Możemy wywołać dowolnykonstruktor tej klasy używając funkcji ’this(parametry konstruktora)’ lub teżwykorzystać konstruktor nadklasy pisząc ’super(parametry konstruktora)’.

By stworzyć nowy obiekt należy nazwę i parametry konstruktora poprzedzićsłowem kluczowym ’new’, która zainicjuje proces tworzenia referencji.

Page 42: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Rozdział 6

Korzystanie z pakietówpodstawowych języka Java

6.1 Kontenery

Kontenerami w Javie nazywamy klasy i interfejsy pomagające programiściew gromadzeniu danych w dynamicznych prostych strukturach danych. Są oneznacznie częściej stosowane z uwagi na możliwość zmieniającego się ich rozmia-ru. W tej części omówimy stosowanie najprostszych z tych konstruktów. Donajprostszych zastosowań używać będziemy niemal zawsze albo kolekcji albotablic asocjacyjnych. Ogólnie omawiając różnicę pomiędzy tymi dwoma typamipolega ona tym, że kolekcje grupują elementy, a tablice asocjacyjne ich pary.Przykładami kolekcji są ciągi, zbiory a relacje i grafy przykładami tablic aso-cjacyjnych. W przypadku programowania dochodzi do tego jeszcze mnóstwoaspektów związanych z wydajnością w czasie dostępu co oszczędności pamięci.

6.1.1 Kolekcje

Wśród podstawowych kolekcji oferowanych przez Javę należy wyróżnić stosy,listy, kolejki oraz drzewa. Stos jest zdecydowanie najprostszą ze struktur dyna-micznych, posiada jedynie 5 prostych operacji

Push umieszcza nowy element na stosie

Pop pobiera element z wierzchołka

Peek odczytuje wartość z wierzchołka bez jej zdejmowania

Empty sprawdzające czy stos jest pusty

Search poszukujące w stosie danego elementu i zwracające ”głębokość” jegopołożenia na stosie. Warto dodać, że poszukiwanie w stosie jest operacjąmało wydajną.

Aby użyć stosu w Javie, załóżmy że posiadamy następują klasę:

class A {public A(String n){

41

Page 43: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 6. KORZYSTANIE Z PAKIETÓWPODSTAWOWYCH JĘZYKA JAVA42

this.name=n;}@Overridepublic String toString() {return "A{" + "name=" + name + ’}’;}private String name;}

Wtedy

public static void main(String[] args) {Stack<A> stos = new Stack<A>();A a = new A("A"),b = new A("B");stos.push(a);stos.push(b);System.out.println("Peek "+stos.peek());System.out.println("Search a "+stos.search(b));System.out.println("Search b "+stos.search(a));System.out.println("Pop once "+stos.pop());System.out.println("Czy pusty "+(stos.empty()?"TAK":"NIE"));System.out.println("Pop second "+stos.pop());System.out.println("Czy pusty "+(stos.empty()?"TAK":"NIE"));}

Spowoduje wyprodukowanie następującego wyniku

Peek A{name=B}Search a 1Search b 2Pop once A{name=B}Czy pusty NIEPop second A{name=A}Czy pusty TAK

Stos podobnie jak inne kolekcje jest tzw. typem ogólnym. Charakterystycznedla typów ogólnych jest to, że należy podać nazwę klasy w nawiasie ¡¿.

Drugim typem danych jest kolejka.

6.1.2 Iteratory

6.1.3 Tablice asocjacyjne

6.1.4 Przeszukiwanie i sortowanie kontenerów

Page 44: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Rozdział 7

Tworzenie aplikacji zinterfejsem graficznymSwing

Język Java pozwala na tworzenie prostych aplikacji okienkowych. Najczęstszympakietem umożliwiającym tworzenie prostych widoków, jest tzw. Swing. Platfor-ma Netbeans posiada wbudowany edytor graficzny, pozwalający na łatwe i przy-jemne tworzenie klas pakietu Swing i dostosowywanie ich do potrzeb działaniaaplikacji. Jest to tak zwany budowniczy interfejsu użytkownika (ang. GraphicalUser Interface Builder lub gui builder). W tym rozdziale omówimy podstawyzwiązane z tworzeniem aplikacji wielo-okienkowej.

7.1 Elementy pakietu Swing

Aby rozpocząć pracę z budowniczym okienek, najlepiej utworzyć sobie nowyprojekt. Do nowego projektu dodajmy sobie klasę JFrame Form z kategoriiSwing Gui Forms. Ta klasa odpowiada nam za okno programu. Po utworzeniunowej klasy i nazwaniu jej dla przykładu: OknoGlowne.java zostaniemy powitaniprzez widok okna budowniczego.

Pierwszym najważniejszym miejscem jakie powinniśmy zauważyć, jest prze-łącznik Source-Design. Okno Swing jest zwykłą klasą Javy, a zatem BudowniczyOkien jest programem generującym kod Javy w oparciu o nasze wytyczne. Wczasie gdy włączony jest przełącznik Design, działa Budowniczy okien i on za-rządza generowaniem kodu dla okna. Przełączając się na Source widzimy bezpo-średnio wygenerowany kod Java. Z uwagi na to, że Budowniczy Okien wygene-rował sporą część klasy i gdybyśmy zaczęli ją zmieniać to Budowniczy utraciłbyzdolność dalszego kontrolowania klasy, część linijek jest wyszarzana i nie moż-na ich edytować. Oznacza to, że pogląd źródeł ma na celu raczej możliwośćdodawania własnych rzeczy do klasy, niż też zmieniania tych generowanych.

Drugim ważnym miejscem Budowniczego Okien jest pasek podręcznych rze-czy pojawiający się z reguły po prawej stronie. Zawiera on wszystkie ważne kom-ponenty Swing, potrzebne do konstruowania nawet dość skomplikowanych okien.Szczegółowo do działania poszczególnych komponentów dojdziemy za chwilę.

43

Page 45: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 7. TWORZENIE APLIKACJI Z INTERFEJSEMGRAFICZNYM SWING44

7.1.1 Uruchamianie okna głównego aplikacji

W chwili utworzenia okna JFrame tworzona jest również do niego metoda mają-ca na celu wyświetlenie go użytkownikowi. Nie jest to już proces tak prosty jakwcześniejsze, wymaga bowiem pracy na tzw. wątkach. Oznacza to, że możliwejest posiada kilkunastu okien i każde z nich będzie pracować zupełnie niezależ-nie od pozostałych. Sprawia jednak, że komunikowanie się okien staje się trochęuciążliwe.

Nowo utworzony projekt standardowo posiada klasę wyposażoną w funk-cję main, która służy do uruchamiania całości projektu. Nowo-tworzone oknarównież wyposażone są w taką metodę, a zatem aby okno uruchamiało wrazze startem projektu funkcja main powinna zostać usunięta z klasy okna, a jejwnętrze wklejone do głównej metody main. Powinno to wyglądać mniej więcejw taki sposób:

public class Okna {

/*** @param args the command line arguments*/public static void main(String[] args) {java.awt.EventQueue.invokeLater(new Runnable() {@Overridepublic void run() {new OknoGlowne().setVisible(true);

}});}

}

Jest to niebanalna konstrukcja mająca następujące działanie.

1. Fragment

new Runnable() {@Overridepublic void run() {new OknoGlowne().setVisible(true);}

tworzy specjalną klasę, której zadaniem jest uruchomienie okna. Takie kla-sy są nazywane z reguły Runnerami. Automatycznie wygenerowany kodnie oddaje z pełni istoty uruchamiaczy okien, ale do ich tematu powró-cimy jeszcze przy tworzeniu pod-okienek. Tworzona jest tutaj tzw. klasaanonimowa tzn. że nie posiada ona swojej nazwy ani konstruktora. Abystworzyć taką klasę należy wskazać klasę po której dziedziczy oraz uzu-pełnić resztę jej wnętrza. W tym wypadku klasa anonimowa pochodzi odinterfejsu wszystkich uruchamiaczy czyli Runnable. Interfejs ten posiadajedną jedyną metodę run czyli uruchom. Zadaniem naszej uruchamiaczajest stworzenie nowego okna ( new OknoGlowne()) oraz wyświetlenia go(.setVisible(true));

2. Fragment

Page 46: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 7. TWORZENIE APLIKACJI Z INTERFEJSEMGRAFICZNYM SWING45

java.awt.EventQueue.invokeLater( \cdot );

odpowiada natomiast za tworzenie nowych wątków. Domyślnie oznaczaon ”Przekaż uruchamiacz do uruchomienia w nowym wątku w najbliższejwolnej chwili”. Parametr, który otrzymuje funkcja invokeLater musi byćtypu Runnable.

W powyższy sposób można tworzyć dowolną ilość okien. Nie jest jednakbanalnym aby nauczyć tak utworzone okna komunikować się ze sobą. Jak tozrobić umówimy w sekcji tworzenia nowych okienek.

7.1.2 Swing - menu

Jednym z pierwszych rzeczy jakie zapragniemy dodać do naszego okna jest głów-ny pasek menu. Rzeczy związane z jego tworzeniem znajdziemy przy działają-cym Budowniczym Okien po prawej stronie w oknie palety. Należy odszukaćPasek Menu czyli Menu Bar. Każde okno może posiadać jeden pasek menu przy-pięty do siebie. Domyślnie pasek ten posiada dwa elementu rozwijalne. Plik/Fileoraz Edycja/Edit. Można je wykorzystać do swoich potrzeb, zmienić lub usu-nąć. Aby dodać pasek menu należy przeciągnąć go z palety do lewego górnegonarożnika okna w którym chcemy go umieścić.

Do paska menu, można dodawać wyłącznie elementy typu menu. Analogicz-nie jak poprzednio polega to na przesunięciu ich z palety i upuszczeniu na PaskuMenu.

Do danego menu, można dodawać inne menu, elementy menu (menu item),elementy będące polami do zaznaczenia (menu checkbox), elementy będące po-lami wyboru jednokrotnego (menu radiobox) lub separatorami czyli liniami roz-dzielającymi.

Każdy z tych elementem kliknięty PPM w Budowniczym Okien pozwala naedytowanie wielu posiadanych przez siebie właściwości. Pierwszą nam niezbędnąjest zmiana nazwy menu lub elementu z menu. Inna, ciut ważniejszą gdy jużzaczniemy dopisać rzeczy do kodu wygenerowanego, będzie zmiana nazwy danejzmiennej.

W dalszej części zajmiemy się jednak najważniejszymi czynnościami jakiemożna przypisać elementom menu, jakimi są opisanie ich wydarzeń.

7.1.3 Swing - kontenery

Obszar we wnętrzu okna można podzielić na obszary, które posłużą nam doprzechowywania w swoim wnętrzu innych elementów Swing.

Zakładki

Najprostszym kontenerem jest kontener zakładek. Aby stworzyć w obszarzeokna zakładki należy przeciągnąć i odpowiednio rozszerzyć obszar zakładek/Tabbed Pane. Aby utworzyć zakładkę należy do niego przeciągnąć Panel. Każ-da z zakładek może posiadać swoją unikatową nazwę. Zakładki są niezwykleskuteczną metodą radzenia sobie z nadmiarem okien. Pisanie nowych okien wy-maga tworzenia ich runnerów oraz opisywania dokładnej komunikacji międzynimi. Tymczasem gdy kilka okien połączyć w jedno okno z zakładkami, całośćstaje znacznie przyjemniejsza w opisywaniu.

Page 47: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

ROZDZIAŁ 7. TWORZENIE APLIKACJI Z INTERFEJSEMGRAFICZNYM SWING46

7.1.4 Swing - kontrolki

Tym co naprawdę wypełnia powierzchnie okna i kontenerów są kontrolki. Kon-trolki są dla okna tym co elementy menu dla samego menu. To one odpowiadająza akcje, wprowadzenia i wyprowadzenia tekstów czy wszystkie inne modyfika-cje.

7.2 Okienka dialogowe

W Javie występuje szereg bardzo prostych okienek, których użycie pozwala naprzyśpieszenie działania programu. Są to okienka:

1. Potwierdzenia z opcjami tak,nie, cofnij

2. Wprowadzenia, celem podania jakiejś danej

3. Wiadomości, wyświetlenia wiadomości

4. Ogólne okno opcji

7.2.1 Przykładowe użycia okienek dialogowych

Dla przykładu jeśli chcemy wywołać okienko upewniające się czy program po-winien się zakończyć:

int n = JOptionPane.showConfirmDialog(this,"Czy zakończyć działanie programu ?" ,"Wyjść?", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);if (n == JOptionPane.OK_OPTION)System.exit(0);

7.3 Wydarzenia

7.3.1 Akcja wykonana

Najczęściej stosowanym wydarzeniem jest wykonanie akcji. Aby opisać co siędzieje gdy przycisk zostanie naciśnięty, menu item wybrany albo tekst wypeł-niony. Aby dodać wykonanie jakiś czynności dla danego obiektu należy kliknąćPPM na nim i wybrać Events -¿ Action Performed. Doprowadzi to do przełą-czenia do widoku kodu i wnętrza automatycznie wygenerowanej funkcji którejzadaniem jest spełnić wszystkie czynności niezbędne do wykonania całej akcjiwywołanej przy wciśnięciu przycisku.

7.4 Właściwości okna

7.5 Nasłuchiwacze

Page 48: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Dodatek A

Zadania laboratoryjne

Laboratorium 1. Rozwiązywanie równania kwadratowego.Napisać program służący do rozwiązywania równania kwadratowego. Pro-

gram powinien działać w interfejsie terminalowym i wczytywać od użytkownikawspółczynniki wielomianu stopnia drugiego. Na polecenie użytkownika, powinnaistnieć możliwość wykonania następujących akcji:

� Wprowadzenia nowego wielomianu stopnia 2

� Policzenia i wypisania wyróżnika wielomianu

� Policzenia i wypisania miejsc zerowych

� Wyjścia z programu

Należy utworzyć klasę Równanie Kwadratowe implementującą dwie funkcje

� double[] rozwiaz()

� double wyroznik()

Które odpowiednio wyznaczają wektor rozwiązań oraz wyróżnik równania.

Laboratorium 2. Rozwiązywanie równania trzeciego stopnia.Rozszerzyć poprzedni program o możliwość rozwiązywania równań trzeciego

stopnia. W tym celu należy zaprojektować odpowiednia hierarchię klas i cech.Należy utworzyć abstrakcyjną klasę Równanie Wielomianowe, które będzie po-siadało swój stopień oraz listę swoich współczynników. Należy stworzyć jeszczeinterfejs Rozwiazywalne Metodą Wyznacznikową posiadający funkcje

double[] rozwiaz()

double wyroznik()W reszcie należy najpierw poprawić klasę Równanie kwadratowe tak by to

dziedziczyło klasę abstrakcyjną oraz interfejs, oraz napisać klasę równania trze-ciego stopnia. Na sam koniec należy przystosować program do możliwości od-czytu Równań kwadratowych.

Dodatkowo! Można przystosować program do wczytywania dowolnego wielo-mianu, a w wypadku próby użycia metody wyznacznikowej dla nieodpowiedniegotypu wielomianu, zgłaszać błąd. Nie można rozwiązać metodą wyznaczników,

47

Page 49: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

DODATEK A. ZADANIA LABORATORYJNE 48

lub w wypadku równania 4 rzędu - Nie utworzona funkcjonalność. Można kon-tynuować rozwój programu o rozwiązywanie równanie liniowego i sprawdzanierównania bez zmiennych (wielomian stopnia 0 równy zeru).

Laboratorium 3. Figury płaskie.Napisać program pozwalający na utworzenie różnych figur płaskich

� Koło

� Trójkąt

� Czworokąt

� Prostokąt

� Romb

� Kwadrat

Figury mają posiadać umiejętność obliczenia swojego pola i obwodu. Należy za-projektować odpowiednia strukturę klas. Ponadto należy utworzyć klasę punk-tu na płaszczyźnie oraz wektora. Opracować interfejs przesuwalne i umożliwićwszystkim obiektom przesuwanie się o wektor. Ponadto należy klasy wyposażyćw odpowiednie implementacje funkcji abstrakcyjnej, która odpowiada na pytanieczy wskazany punkt należy do danej figury.

Laboratorium 4. Rzut kostką n-ściennąNapisać program okienkowy w Java Swing pozwalający na wygenerowanie

rzutu dowolną kością n-ścienną. Program powinien korzystać z klasy Kostka,która posiada w sobie wszystkie elementy losowości, a interfejs graficzny jedy-nie służy do ich wywołania. Aplikacja powinna zawierać w sobie pasek menu,umożliwiający jej zamknięcie, przycisk losowania, odpowiednie etykiety oraz poletekstowe do podania przez użytkownika ilości ścian. Dane podawane przez użyt-kownika powinny być zabezpieczone przed podaniem danej złego formatu (innegoniż liczba całkowita) oraz spoza zakresu ( zero lub mniej).

Laboratorium 5. StosNapisać własną obsługę stosu i wyposażyć tak zdefiniowana klasę w odpo-

wiednie funkcje jak

Push włóż na stos

Pop pobierz z wierzchołka stosu

Top odczytaj wartość z wierzchołka stosu, bez jej zdejmowania

isEmpty czy stos jest pusty

Contains czy stos zawiera element o danym kluczu

Remove usuń element o wskazanym kluczu ze stosu

Laboratorium 6. Bank - 2 zajęciaNapisać aplikację okienkową polegającą na zarządzaniu kontami bankowymi.

Aplikacja ma pozwalać na

Page 50: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

DODATEK A. ZADANIA LABORATORYJNE 49

� tworzenie użytkowników

� zamykanie kont użytkowników

� realizowanie wpłat i wypłat

� realizowanie przelewów pomiędzy kontami użytkowników

� dane powinny być zapisywane w plikach tekstowych w języku xml

Obowiązuje zasada 1 użytkownik = 1 konto.

Page 51: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Dodatek B

Zadania projektowe

Projekt 1. Napisać program obliczający liczbę π jako granicę ciągu. Ciąg możebyć dowolnie wybrany z tych które w granicy posiadają liczbę π. Np. wiadomo,że

π2

6=∞∑i=0

1i2

(B.1)

Powyższe można przekształcić do utworzenia ciągu zbieżnego do liczby. Do stwo-rzenia w ramach zadania jest klasa Ciąg Liczbowy posiadająca funkcję zwracają-cą wartość ciągu dla podanego miejsca w ciągu. Następnie w ciele funkcji mainnapisać algorytm obliczający wartość liczby pi jako granicy ciągu, przy ustalo-nym ε parametrze dokładności.

Każdy projekt musi wykorzystywać inną zależność związaną z liczbą π.

Projekt 2. Rozszerzyć zadanie laboratoryjne o jedną z figur płaskich takich jak:

1. Kwadrat

2. Prostokąt

3. Romb

4. Trapez

5. Elipsa

6. Deltoid

7. Sześciokąt

Klasa ma zostać wyposażona w własne implementacje dziedziczonych metod (zwyłączeniem przesun w szczególnych przypadkach) i posiadać co najmniej 4 me-tody jej konstruowania (4 różne konstruktory). Dla przykładu dla czworokątaalternatywną metodą konstruowania jest podanie punktu oraz dwóch wektorów oróżnych kierunkach.

Projekt 3. Napisać bibliotekę realizującą algorytmy sortowania

� bąbelkowego

� przez wstawianie

50

Page 52: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

DODATEK B. ZADANIA PROJEKTOWE 51

� przez wybór

Oraz zaprezentować jej działanie z użyciem testów JUnit

Projekt 4. Napisać bibliotekę realizującą algorytmy sortowania

� szybkiego

� przez łączenie

Oraz zaprezentować jej działanie z użyciem testów JUnit

Projekt 5. Napisać program odszukujący minimum funkcji unimodalnej (po-siadającej pojedynczy punkt minimum w zadanym przedziale) metodami

� dychotomii

� Fibonacci

Page 53: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Dodatek C

Zadania do samodzielnegorozwiązania

C.1 Zadanie z prostych algorytmów

Zadanie C.1. Napisz program, którego zadaniem będzie zapytać użytkownikao imię, a potem ładnie się z nim przywitać.

Zadanie C.2. Napisać program, którego zadaniem jest porównać dwie liczbyrzeczywiste, oraz porównać moduły tych liczb i wypisać, która z liczb pod którymwzględem jest większa.

Zadanie C.3. Napisz program, którego zadaniem będzie wczytać linijkę tekstuz pojedynczą operacją matematyczną +,-,*,/. Program ma policzyć wynik i wy-pisać go na ekranie. Zamiana wczytanego ciągu znaków na wartość ma odbyćsię z pomocą funkcji (napisanej przez programistę)

double compute(String text){}

Zadanie C.4. Napisać program, którego zadaniem jest sprawdzić czy liczbapodana przez użytkownika jest liczbą pierwszą. Jeśli nie jest, program ma wypisaćjej wszystkie dzielnik właściwe. Do wykonania powyższego należy napisać dwiefunkcje

boolean isPrime(int number){}int[] findDivisors(int number){}

Zadanie C.5. Napisać program do liczenia liczby silnia oraz symbolu newtona

Zadanie C.6. Napisać implementacje sita Eratostenesa poszukiwania liczb pierw-szych

Zadanie C.7. Napisać program do obliczania potęgi liczby naturalnej bez uży-wania operatora mnożenia. Wskazówka. Przypomnieć sobie wzory z szeregów.

C.2 Zadania z modelowania w języku Java

Zadanie C.8. Napisać program, którego zadaniem jest realizacja podstawowychoperacji na liczbach zespolonych. W szczególności należy uzupełnić klasę Com-plexNumber o postaci

52

Page 54: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

DODATEK C. ZADANIA DO SAMODZIELNEGO ROZWIĄZANIA 53

static class ComplexNumber {

double real;double imaginary;/*** Dodaje dwie liczby zespolone* @param left lewy operand* @param right prawy operand* @return wynik dodawania*/static ComplexNumber add(ComplexNumber left, ComplexNumber right) {return null;

}/*** Odejmuje dwie liczby zespolone* @param left lewy operand* @param right prawy operand* @return wynik odejmowania*/static ComplexNumber subtract(ComplexNumber left, ComplexNumber right) {return null;

}/*** Mnoży dwie liczby zespolone* @param left lewy operand* @param right prawy operand* @return wynik mnożenia*/static ComplexNumber multiply(ComplexNumber left, ComplexNumber right) {return null;

}/*** Dzieli dwie liczby zespolone* @param left lewy operand* @param right prawy operand* @return wynik dzielenia*/static ComplexNumber divide(ComplexNumber left, ComplexNumber right) {return null;

}/*** Wypisuje liczbę zespoloną* @return liczba zespolona w postaci (a+bi)*/String print() {return null;

}}

Page 55: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

DODATEK C. ZADANIA DO SAMODZIELNEGO ROZWIĄZANIA 54

Programista ma zapewnić użytkownikowi swobodę wyboru operacji oraz podanialiczb zespolonych. Program powinien kończyć się po podaniu specjalnej komendykończącej.

Wskazówka. Dodawania dwóch liczb będzie miało postać:

ComplexNumber c1,c2;...ComplexNumber c3 = ComplexNumber.add(c1,c2);

Zadanie C.9. Napisać program pozwalający na utworzenie wielu różnych pojaz-dów (samolot, pociąg, samochód, motocykl, rower), które mogą się przemieszczaćpomiędzy punktami A i B na płaszczyźnie. Pojazd posiada jaką swoje prywatneskładowe:

� prędkość

� bieżącą pozycje (klasy punkt)

Pojazdy posiadają funkcję jedź(), która powoduje przesunięcie się o odległośćzgodną z ich prędkością w kierunku ustalonego celu, lub osiągnięcie go jeśli jeston w zasięgu. Funkcja jedź jest wywoływana cyklicznie i z równą częstością dlakażdego pojazdu umieszczonego na trasie. Na zakończenie cyklu wszystkie pojaz-dy podają przebytą odległość oraz czy osiągnęły cel.

C.3 Zadania z prostych aplikacji graficznych

Zadanie C.10. Napisać prosty program do przeliczania walut wg podanego kur-su

Zadanie C.11. Napisać program do gry w wisielca. Słownik słów powinien byćpodany poprzez plik tekstowy, i do gry powinno być losowane dowolne słowo zesłownika. Gracz może wykonać dwie akcje

� Szukaj spółgłoski

� Zgadnij hasło

Szukanie spółgłoski oraz nieudane zgadywanie hasła ma powodować wyczerpy-wanie się możliwości do błędu gracza.

Page 56: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Spis rysunków

55

Page 57: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Spis tabel

56

Page 58: Podstawy programowania w języku Java - kizar.plkizar.pl/wp-content/uploads/2018/01/podstawy_programowania_java.pdf · Niezależność poziomów programowania Zgodność wstecz Poziomy

Bibliografia

[1] Bruce Eckel. Thinking in Java. Helion, Gliwice, 4 edition, 2006.

[2] Jerzy Grębosz. Symfonia C++ standard, volume 1. Edition 2000, Kraków,3 edition, 2008.

57