PO Wstęp do Javy: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Janusz (dyskusja | edycje)
Nie podano opisu zmian
Janusz (dyskusja | edycje)
Nie podano opisu zmian
Linia 1: Linia 1:
{{powrot|Programowanie obiektowe|}}
{{powrot|Programowanie obiektowe|}}


== Wstêp do Javy ==
== Wstęp do Javy ==


=== Wprowadzenie ===
=== Wprowadzenie ===


Od tego wyk³adu zaczynamy poznawanie programowania obiektowe na przyk³adzie konkretnego jêzyka programowania. Bêdzie to Java. Java jest jednym ze wspó³czesnych, nowoczesnych jêzyków obiektowych. Jest te¿ bardzo popularna. Wszystkie te cechy uzasadniaj¹ wybór tego jêzyka jako narzêdzia do pokazania mechanizmów obiektowych. Nale¿y jednak podkreœliæ, ¿e nie jest to jedyna mo¿liwoœæ. Niniejszy wyk³ad z bardzo ma³ymi zmianami, mo¿na by by³o oprzeæ na C#. Mo¿na te¿ z bardzo dobrym skutkiem skonstruowaæ wyk³ad z programowania obiektowego zestawiaj¹c ze sob¹ czysto obiektowy Smalltalk z hybrydowym C++ (choæ wymaga to ju¿ pewnej dojrza³oœci programistycznej od s³uchaczy). Mo¿liwoœci jest wiele, twórcy ka¿dego wyk³adu musz¹ dokonaæ jakiegoœ wyboru. Wa¿ne jest to, by s³uchaczom wyk³adu nie umkn¹³ podstawowy fakt: wybrany jêzyk programowania jest tylko narzêdziem s³u¿¹cym do pokazania na przyk³adach na czym polega programowanie obiektowe i jego wybór, aczkolwiek niezbêdny, jest rzecz¹ wtórn¹.
Od tego wykładu zaczynamy poznawanie programowania obiektowe na przykładzie konkretnego języka programowania. Będzie to Java. Java jest jednym ze współczesnych, nowoczesnych języków obiektowych. Jest też bardzo popularna. Wszystkie te cechy uzasadniają wybór tego języka jako narzędzia do pokazania mechanizmów obiektowych. Należy jednak podkreślić, że nie jest to jedyna możliwość. Niniejszy wykład z bardzo małymi zmianami, można by było oprzeć na C#. Można też z bardzo dobrym skutkiem skonstruować wykład z programowania obiektowego zestawiając ze sobą czysto obiektowy Smalltalk z hybrydowym C++ (choć wymaga to już pewnej dojrzałości programistycznej od słuchaczy). Możliwości jest wiele, twórcy każdego wykładu muszą dokonać jakiegoś wyboru. Ważne jest to, by słuchaczom wykładu nie umknął podstawowy fakt: wybrany język programowania jest tylko narzędziem służącym do pokazania na przykładach na czym polega programowanie obiektowe i jego wybór, aczkolwiek niezbędny, jest rzeczą wtórną.


W trakcie wyk³adu omówimy wiele cech i konstrukcji Javy. Chcemy jednak mocno podkreœliæ, ¿e nie jest naszym celem stworzenie podrêcznika Javy. Na szczêœcie firmowa dokumentacja Javy jest bardzo obszerna i powszechnie, darmowo dostêpna. Dotyczy to tak definicji jêzyka jak i opisu standardowych bibliotek. Nie czujemy siê wiêc zobowi¹zani do omawiania tych cech Javy, które z punktu widzenia tego wyk³adu maj¹ ma³e znaczenie (na przyk³ad zupe³nie pomijamy kwestie zwi¹zane ze wspó³bie¿noœci¹). Java mimo m³odego wieku przesz³a ju¿ wiele zmian, my bêdziemy bazowaæ na jej dystrybucji J2SE 1.6 i opisie jêzyka podanym w trzecim wydaniu jego specyfikacji (z roku 2005).
W trakcie wykładu omówimy wiele cech i konstrukcji Javy. Chcemy jednak mocno podkreślić, że nie jest naszym celem stworzenie podręcznika Javy. Na szczęście firmowa dokumentacja Javy jest bardzo obszerna i powszechnie, darmowo dostępna. Dotyczy to tak definicji języka jak i opisu standardowych bibliotek. Nie czujemy się więc zobowiązani do omawiania tych cech Javy, które z punktu widzenia tego wykładu mają małe znaczenie (na przykład zupełnie pomijamy kwestie związane ze współbieżnością). Java mimo młodego wieku przeszła już wiele zmian, my będziemy bazować na jej dystrybucji J2SE 1.6 i opisie języka podanym w trzecim wydaniu jego specyfikacji (z roku 2005).


Standardowe biblioteki Javy bardzo rozbudowane - instaluj¹c podstawow¹ dystrybucjê Javy (J2SE) dostajemy do dyspozycji prawie cztery tysi¹ce klas zgrupowanych w oko³o dwustu pakietów. Oczywiœcie nie bêdziemy próbowali ich wszystkich omawiaæ w ramach naszego wyk³adu, natomiast bêdziemy czerpaæ z nich przyk³ady budowy rozbudowanych i z³o¿onych hierarchii klas (zajmiemy siê strumieniami, kolekcjami i klasami do tworzeniem graficznych interfejsów u¿ytkownika).
Standardowe biblioteki Javy bardzo rozbudowane - instalując podstawową dystrybucję Javy (J2SE) dostajemy do dyspozycji prawie cztery tysiące klas zgrupowanych w około dwustu pakietów. Oczywiście nie będziemy próbowali ich wszystkich omawiać w ramach naszego wykładu, natomiast będziemy czerpać z nich przykłady budowy rozbudowanych i złożonych hierarchii klas (zajmiemy się strumieniami, kolekcjami i klasami do tworzeniem graficznych interfejsów użytkownika).


Po tych wyjaœnieniach pora zaczynaæ!
Po tych wyjaśnieniach pora zaczynać!


=== Zaczynamy ===
=== Zaczynamy ===


Java jest wysokopoziomowym, kompilowanym, obiektowym jêzykiem programowania z siln¹ kontrol¹ typów. Sk³adnia Javy jest wzorowana na C/C++. Jednym z za³o¿eñ projektowych Javy by³o stworzenie jêzyka wzorowanego na C++ ale bezpieczniejszego, dlatego w Javie nie ma na przyk³ad wskaŸników. Inne za³o¿enie projektowe dotyczy³o przenoœnoœci programów w Javie. Poniewa¿ Java m.in. zosta³a zaprojektowana z myœl¹ o uruchamianie programów pobieranych przez sieæ, jêzyk musia³ byæ tak zaprojektowany i wyspecyfikowany, by efekt dzia³ania programu nie zale¿a³ od tego, jakiej implementacji jêzyka u¿yto (oczywiœcie przy za³o¿eniu jej zgodnoœci ze specyfikacj¹ jêzyka). Ciekaw¹ cech¹ Javy jest to, ¿e kompilator Javy nie generuje kodu maszynowego, lecz kod poœredni (tak zwany bajtkod), który jest wykonywany przez wirtualn¹ maszynê Javy. Takich wirtualnych maszyn Javy stworzono wiele dla ró¿nych systemów operacyjnych i komputerów. Dziêki temu rozwi¹zaniu i wspomnianej wczeœniej œcis³ej specyfikacji jêzyka, mo¿na napisaæ program w Javie na przyk³ad na komputerze domowym, skompilowaæ go, przes³aæ skompilowan¹ jego postaæ na drugi koniec œwiata na du¿y komputer w centrum obliczeniowym i tam go wykonaæ. Efekt dzia³ania bêdzie taki sam.<ref>Zdarzaj¹ siê wprawdzie tak¿e w Javie problemy z przenoszeniem oprogramowania, ale one zwykle spowodowane nie niezgodnoœci¹ samych maszyn wirtualnych, lecz specyficznymi cechami œrodowisk, w jakich te programy siê uruchamia. Ale nale¿y mocno podkreœliæ, o ile w przypadku wiêkszoœci jêzyków programowania norm¹ jest to, ¿e uruchomienie programu na maszynie o innej architekturze wymaga co najmniej ponownego skompilowania programu, o tyle w przypadku Javy regu³¹ jest to, ¿e program dzia³a na ka¿dym komputerze tak samo, bez ¿adnych dodatkowych zabiegów.</ref>
Java jest wysokopoziomowym, kompilowanym, obiektowym językiem programowania z silną kontrolą typów. Składnia Javy jest wzorowana na C/C++. Jednym z założeń projektowych Javy było stworzenie języka wzorowanego na C++ ale bezpieczniejszego, dlatego w Javie nie ma na przykład wskaźników. Inne założenie projektowe dotyczyło przenośności programów w Javie. Ponieważ Java m.in. została zaprojektowana z myślą o uruchamianie programów pobieranych przez sieć, język musiał być tak zaprojektowany i wyspecyfikowany, by efekt działania programu nie zależał od tego, jakiej implementacji języka użyto (oczywiście przy założeniu jej zgodności ze specyfikacją języka). Ciekawą cechą Javy jest to, że kompilator Javy nie generuje kodu maszynowego, lecz kod pośredni (tak zwany bajtkod), który jest wykonywany przez wirtualną maszynę Javy. Takich wirtualnych maszyn Javy stworzono wiele dla różnych systemów operacyjnych i komputerów. Dzięki temu rozwiązaniu i wspomnianej wcześniej ścisłej specyfikacji języka, można napisać program w Javie na przykład na komputerze domowym, skompilować go, przesłać skompilowaną jego postać na drugi koniec świata na duży komputer w centrum obliczeniowym i tam go wykonać. Efekt działania będzie taki sam.<ref>Zdarzają się wprawdzie także w Javie problemy z przenoszeniem oprogramowania, ale one zwykle spowodowane nie niezgodnością samych maszyn wirtualnych, lecz specyficznymi cechami środowisk, w jakich te programy się uruchamia. Ale należy mocno podkreślić, o ile w przypadku większości języków programowania normą jest to, że uruchomienie programu na maszynie o innej architekturze wymaga co najmniej ponownego skompilowania programu, o tyle w przypadku Javy regułą jest to, że program działa na każdym komputerze tak samo, bez żadnych dodatkowych zabiegów.</ref>


Od wydania znakomitej ksi¹¿ki o C przez Kernighana i Ritchiego sta³o siê zwyczajem, by pierwszy prezentowany w danym jêzyku program wypisywa³ pozdrowienie dla œwiata, nie wypada nam wiêc post¹piæ inaczej:
Od wydania znakomitej książki o C przez Kernighana i Ritchiego stało się zwyczajem, by pierwszy prezentowany w danym języku program wypisywał pozdrowienie dla świata, nie wypada nam więc postąpić inaczej:


   public class HelloWorld {  
   public class HelloWorld {  
Linia 25: Linia 25:
   }
   }


Programy w Javie sk³adaj¹ siê z ''klas''. Na razie przyjmijmy - w wielkim uproszczeniu - ¿e klasa jest takim lepszym typem rekordowym z Pascala (czy typem struktur z C), zawieraj¹cym oprócz zwyk³ych pól tak¿e funkcje. W jêzykach obiektowych funkcje zdefiniowane w klasach nazywamy ''metodami''.  
Programy w Javie składają się z ''klas''. Na razie przyjmijmy - w wielkim uproszczeniu - że klasa jest takim lepszym typem rekordowym z Pascala (czy typem struktur z C), zawierającym oprócz zwykłych pól także funkcje. W językach obiektowych funkcje zdefiniowane w klasach nazywamy ''metodami''.  


Przedstawiony program sk³ada siê z jednej klasy o nazwie ''HelloWorld''. Definicja klasy rozpoczyna siê od s³owa '''class''' poprzedzonego byæ mo¿e dodatkowymi specyfikacjami dostêpu (tu mamy jedn¹ '''public''', informuj¹c¹ kompilator, ¿e nasza klasa jest dostêpna tak¿e poza swoim pakietem, o pakietach powiemy dalej).<ref>W tym przyk³adzie s³owo ''public'' przed deklaracj¹ klasy mo¿na pomin¹æ.</ref> Przedstawiona klasa zawiera tylko jedn¹ sk³adow¹, jest ni¹ metoda o nazwie ''main''. Ta nazwa metody nie jest przypadkowa. Wykonanie ca³ego programu w Javie polega na wykonaniu metody main z g³ównej klasy programu (w naszym programie jest tylko jedna klasa, wiêc wybór klasy g³ównej nie nastrêcza tu problemów).  
Przedstawiony program składa się z jednej klasy o nazwie ''HelloWorld''. Definicja klasy rozpoczyna się od słowa '''class''' poprzedzonego być może dodatkowymi specyfikacjami dostępu (tu mamy jedną '''public''', informującą kompilator, że nasza klasa jest dostępna także poza swoim pakietem, o pakietach powiemy dalej).<ref>W tym przykładzie słowo ''public'' przed deklaracją klasy można pominąć.</ref> Przedstawiona klasa zawiera tylko jedną składową, jest nią metoda o nazwie ''main''. Ta nazwa metody nie jest przypadkowa. Wykonanie całego programu w Javie polega na wykonaniu metody main z głównej klasy programu (w naszym programie jest tylko jedna klasa, więc wybór klasy głównej nie nastręcza tu problemów).  


Metoda main musi byæ przygotowana na przyjêcie jako argumentu tablicy napisów zawieraj¹cej argumenty podane w wierszu polecenia przy wywo³aniu programu (nawet jeœli, tak jak przyk³adowa metoda, ignoruje te argumenty). Deklaracja parametrów metody wygl¹da bardzo podobnie jak w wiêkszoœci jêzyków programowania. Podaje siê sekwencjê deklaracji poszczególnych parametrów (u nas ta sekwencja ma d³ugoœæ 1), a poszczególne deklaracje oddziela siê jakimœ separatorem (w Javie jest to akurat przecinek). Ka¿da deklaracja okreœla nazwê i typ parametru (czasem te¿ jakieœ dodatkowe cechy parametru, jak na przyk³ad sposób przekazywania - tak jest w Pascalu czy C# - ale w Javie nie ma takich dodatkowych informacji). W naszym przyk³adzie parametr nazywa siê ''args'' a typem jego wartoœci jest ''String[]'', czyli tablica napisów, przy czym d³ugoœæ tablicy mo¿e byæ dowolna. Zwróæmy uwagê, ¿e w Javie (tak jak w C i innych jêzykach wywodz¹cych siê z C) najpierw podaje siê typ, a potem nazwê parametru (choæ to parametr, a nie typ, jest w tym miejscu definiowany).
Metoda main musi być przygotowana na przyjęcie jako argumentu tablicy napisów zawierającej argumenty podane w wierszu polecenia przy wywołaniu programu (nawet jeśli, tak jak przykładowa metoda, ignoruje te argumenty). Deklaracja parametrów metody wygląda bardzo podobnie jak w większości języków programowania. Podaje się sekwencję deklaracji poszczególnych parametrów (u nas ta sekwencja ma długość 1), a poszczególne deklaracje oddziela się jakimś separatorem (w Javie jest to akurat przecinek). Każda deklaracja określa nazwę i typ parametru (czasem też jakieś dodatkowe cechy parametru, jak na przykład sposób przekazywania - tak jest w Pascalu czy C# - ale w Javie nie ma takich dodatkowych informacji). W naszym przykładzie parametr nazywa się ''args'' a typem jego wartości jest ''String[]'', czyli tablica napisów, przy czym długość tablicy może być dowolna. Zwróćmy uwagę, że w Javie (tak jak w C i innych językach wywodzących się z C) najpierw podaje się typ, a potem nazwę parametru (choć to parametr, a nie typ, jest w tym miejscu definiowany).


Poniewa¿ w Javie wszystkie metody funkcjami (a nie procedurami), nale¿y jeszcze okreœliæ typ wyniku metody ''main''. Tak pechowo siê sk³ada, ¿e akurat ta metoda jest kiepskim kandydatem na funkcjê, bo nie daje ¿adnego wyniku (w przeciwieñstwie do funkcji main z C/C++). Tradycyjny trik stosowany w jêzykach wywodz¹cych siê od C polega na definiowaniu takich funkcji jako funkcji o pustym zbiorze wyników. Typ reprezentuj¹cy pusty zbiór wartoœci nazywa siê ''void''. Typ wyniku metody podaje siê w Javie (i wielu innych jêzykach programowania) przed nazw¹ metody (niezgodnie niestety z tradycj¹ matematyczn¹).  
Ponieważ w Javie wszystkie metody funkcjami (a nie procedurami), należy jeszcze określić typ wyniku metody ''main''. Tak pechowo się składa, że akurat ta metoda jest kiepskim kandydatem na funkcję, bo nie daje żadnego wyniku (w przeciwieństwie do funkcji main z C/C++). Tradycyjny trik stosowany w językach wywodzących się od C polega na definiowaniu takich funkcji jako funkcji o pustym zbiorze wyników. Typ reprezentujący pusty zbiór wartości nazywa się ''void''. Typ wyniku metody podaje się w Javie (i wielu innych językach programowania) przed nazwą metody (niezgodnie niestety z tradycją matematyczną).  


Przed typem metody podane dodatkowe specyfikatory. S³owo '''public''' oznacza, ¿e metoda jest widoczna poza klas¹. S³owo '''static''' oznacza, ¿e jest to metoda klasowa, czyli taka, do wywo³ania której nie jest potrzebny egzemplarz obiektu tej klasy. Tak jak wspominaliœmy wczeœniej klasa odpowiada typowi, zaœ wartoœci typu klasowego, egzemplarze tego typu,  to ''obiekty''. Zwykle wywo³ujemy metody obiektów, ale mo¿na te¿ wywo³ywaæ metody klas. Jest to szczególnie istotne w naszym programie, gdzie nie utworzyliœmy ¿adnego obiektu.
Przed typem metody podane dodatkowe specyfikatory. Słowo '''public''' oznacza, że metoda jest widoczna poza klasą. Słowo '''static''' oznacza, że jest to metoda klasowa, czyli taka, do wywołania której nie jest potrzebny egzemplarz obiektu tej klasy. Tak jak wspominaliśmy wcześniej klasa odpowiada typowi, zaś wartości typu klasowego, egzemplarze tego typu,  to ''obiekty''. Zwykle wywołujemy metody obiektów, ale można też wywoływać metody klas. Jest to szczególnie istotne w naszym programie, gdzie nie utworzyliśmy żadnego obiektu.


Treœæ metody ''main'' sk³ada siê z jednego wywo³ania metody o nazwie ''println'', wypisuj¹cej na konsoli tekstowej (czyli na standardowym wyjœciu programów dzia³aj¹cych w trybie tekstowym), tekst zadany jako parametr. Wywo³uj¹c metodê w Javie musimy podaæ obiekt, na rzecz którego tê metodê wywo³ujemy. W tym przypadku jest to obiekt ''out'' reprezentuj¹cy standardowy strumieñ wyjœciowy (jest to obiekt klasy PrintStream). Obiekt ten jest atrybutem (polem w terminologii rekordów z Pascala) klasy System. W tej klasie zebrano podstawowe operacje i obiekty zwi¹zany ze standardowym wejœciem i wyjœciem oraz z systemem operacyjnym, pod kontrol¹ którego dzia³a program. Zwróæmy uwagê, ¿e obiekt ''out'' jest atrybutem klasowym, to znaczy dostêpnym bezpoœrednio w klasie System, a nie jej egzemplarzach (których zreszt¹ dla tej akurat klasy nie daje siê tworzyæ). W celu odwo³ywania siê do metody lub atrybutu klasy w Javie stosuje siê (typow¹ dla wiêkszoœci jêzyków obiektowych) notacjê kropkow¹:
Treść metody ''main'' składa się z jednego wywołania metody o nazwie ''println'', wypisującej na konsoli tekstowej (czyli na standardowym wyjściu programów działających w trybie tekstowym), tekst zadany jako parametr. Wywołując metodę w Javie musimy podać obiekt, na rzecz którego tę metodę wywołujemy. W tym przypadku jest to obiekt ''out'' reprezentujący standardowy strumień wyjściowy (jest to obiekt klasy PrintStream). Obiekt ten jest atrybutem (polem w terminologii rekordów z Pascala) klasy System. W tej klasie zebrano podstawowe operacje i obiekty związany ze standardowym wejściem i wyjściem oraz z systemem operacyjnym, pod kontrolą którego działa program. Zwróćmy uwagę, że obiekt ''out'' jest atrybutem klasowym, to znaczy dostępnym bezpośrednio w klasie System, a nie jej egzemplarzach (których zresztą dla tej akurat klasy nie daje się tworzyć). W celu odwoływania się do metody lub atrybutu klasy w Javie stosuje się (typową dla większości języków obiektowych) notację kropkową:
   
   
   obiekt.sk³adowa
   obiekt.składowa


gdzie sk³adowa mo¿e byæ metod¹ (i wtedy podajemy jeszcze jej parametry otoczone nawiasami okr¹g³ymi) lub atrybutem. Oczywiœcie mo¿emy siê dalej odwo³ywaæ do sk³adowych atrybutu lub wyniku metody.
gdzie składowa może być metodą (i wtedy podajemy jeszcze jej parametry otoczone nawiasami okrągłymi) lub atrybutem. Oczywiście możemy się dalej odwoływać do składowych atrybutu lub wyniku metody.


=== Komentarze ===
=== Komentarze ===


Komentarze jednowierszowe zaczynaj¹ siê od dwu ukoœników i rozci¹gaj¹ a¿
Komentarze jednowierszowe zaczynają się od dwu ukośników i rozciągają aż
do koñca wiersza.
do końca wiersza.


   // To jest komentarz jednowierszowy
   // To jest komentarz jednowierszowy


Komentarze wielowierszowe ograniczone przez /* na pocz¹tku i */ na koñcu (oczywiœcie komentarz wielowierszowy mo¿e mieœciæ siê ca³kowicie w jednym wierszu, mo¿e te¿ nawet byæ kilka takich komentarzy w jednym wierszu).
Komentarze wielowierszowe ograniczone przez /* na początku i */ na końcu (oczywiście komentarz wielowierszowy może mieścić się całkowicie w jednym wierszu, może też nawet być kilka takich komentarzy w jednym wierszu).


   /* To jest  
   /* To jest  
Linia 55: Linia 55:
   /* A */ /* to */ /* kilka */ /* takich */ /* komentarzy */
   /* A */ /* to */ /* kilka */ /* takich */ /* komentarzy */
    
    
Komentarzy wielowierszowych nie mo¿na zagnie¿d¿aæ jednych w drugich.
Komentarzy wielowierszowych nie można zagnieżdżać jednych w drugich.


   /* To jest komentarz /* to nadal jest komentarz */ a_to_ju¿_nie
   /* To jest komentarz /* to nadal jest komentarz */ a_to_już_nie


=== Elementy leksykalne Javy ===
=== Elementy leksykalne Javy ===


Nie bêdziemy tu zbytnio wchodziæ w szczegó³y, odsy³aj¹c bardziej zainteresowanych czytelników do raportu jêzyka. Pozwolimy sobie jedynie podsumowaæ najwa¿niejsze elementy leksykalne.
Nie będziemy tu zbytnio wchodzić w szczegóły, odsyłając bardziej zainteresowanych czytelników do raportu języka. Pozwolimy sobie jedynie podsumować najważniejsze elementy leksykalne.


==== Identyfikatory ====
==== Identyfikatory ====


* Identyfikatory sk³adaj¹ siê z liter i cyfr, znak "_" jest traktowany jako litera<ref>Tak¿e znak "$", ale nie powinno siê go u¿ywaæ w zwyk³ych programach.</ref>,
* Identyfikatory składają się z liter i cyfr, znak "_" jest traktowany jako litera<ref>Także znak "$", ale nie powinno się go używać w zwykłych programach.</ref>,
* Poniewa¿ Java u¿ywa u¿ywa kodowania znaków UniCode, to identyfikatory mog¹ zawieraæ znaki narodowe (w tym polskie),
* Ponieważ Java używa używa kodowania znaków UniCode, to identyfikatory mogą zawierać znaki narodowe (w tym polskie),
* Nie ma ograniczenia na d³ugoœæ identyfikatorów,
* Nie ma ograniczenia na długość identyfikatorów,
* Identyfikatory nie mog¹ byæ s³owami kluczowymi Javy ani litera³ami ''true'', ''false'' i ''null''.
* Identyfikatory nie mogą być słowami kluczowymi Javy ani literałami ''true'', ''false'' i ''null''.
    
    
==== S³owa kluczowe ====
==== Słowa kluczowe ====


Oto lista s³ów kluczowych Javy
Oto lista słów kluczowych Javy


<!--{| border="0" cellpadding="5" cellspacing="0" align="center"
<!--{| border="0" cellpadding="5" cellspacing="0" align="center"
|+'''S³owa kluczowe'''
|+'''Słowa kluczowe'''
-->
-->



Wersja z 21:45, 2 paź 2006

<<< Powrót

Wstęp do Javy

Wprowadzenie

Od tego wykładu zaczynamy poznawanie programowania obiektowe na przykładzie konkretnego języka programowania. Będzie to Java. Java jest jednym ze współczesnych, nowoczesnych języków obiektowych. Jest też bardzo popularna. Wszystkie te cechy uzasadniają wybór tego języka jako narzędzia do pokazania mechanizmów obiektowych. Należy jednak podkreślić, że nie jest to jedyna możliwość. Niniejszy wykład z bardzo małymi zmianami, można by było oprzeć na C#. Można też z bardzo dobrym skutkiem skonstruować wykład z programowania obiektowego zestawiając ze sobą czysto obiektowy Smalltalk z hybrydowym C++ (choć wymaga to już pewnej dojrzałości programistycznej od słuchaczy). Możliwości jest wiele, twórcy każdego wykładu muszą dokonać jakiegoś wyboru. Ważne jest to, by słuchaczom wykładu nie umknął podstawowy fakt: wybrany język programowania jest tylko narzędziem służącym do pokazania na przykładach na czym polega programowanie obiektowe i jego wybór, aczkolwiek niezbędny, jest rzeczą wtórną.

W trakcie wykładu omówimy wiele cech i konstrukcji Javy. Chcemy jednak mocno podkreślić, że nie jest naszym celem stworzenie podręcznika Javy. Na szczęście firmowa dokumentacja Javy jest bardzo obszerna i powszechnie, darmowo dostępna. Dotyczy to tak definicji języka jak i opisu standardowych bibliotek. Nie czujemy się więc zobowiązani do omawiania tych cech Javy, które z punktu widzenia tego wykładu mają małe znaczenie (na przykład zupełnie pomijamy kwestie związane ze współbieżnością). Java mimo młodego wieku przeszła już wiele zmian, my będziemy bazować na jej dystrybucji J2SE 1.6 i opisie języka podanym w trzecim wydaniu jego specyfikacji (z roku 2005).

Standardowe biblioteki Javy są bardzo rozbudowane - instalując podstawową dystrybucję Javy (J2SE) dostajemy do dyspozycji prawie cztery tysiące klas zgrupowanych w około dwustu pakietów. Oczywiście nie będziemy próbowali ich wszystkich omawiać w ramach naszego wykładu, natomiast będziemy czerpać z nich przykłady budowy rozbudowanych i złożonych hierarchii klas (zajmiemy się strumieniami, kolekcjami i klasami do tworzeniem graficznych interfejsów użytkownika).

Po tych wyjaśnieniach pora zaczynać!

Zaczynamy

Java jest wysokopoziomowym, kompilowanym, obiektowym językiem programowania z silną kontrolą typów. Składnia Javy jest wzorowana na C/C++. Jednym z założeń projektowych Javy było stworzenie języka wzorowanego na C++ ale bezpieczniejszego, dlatego w Javie nie ma na przykład wskaźników. Inne założenie projektowe dotyczyło przenośności programów w Javie. Ponieważ Java m.in. została zaprojektowana z myślą o uruchamianie programów pobieranych przez sieć, język musiał być tak zaprojektowany i wyspecyfikowany, by efekt działania programu nie zależał od tego, jakiej implementacji języka użyto (oczywiście przy założeniu jej zgodności ze specyfikacją języka). Ciekawą cechą Javy jest to, że kompilator Javy nie generuje kodu maszynowego, lecz kod pośredni (tak zwany bajtkod), który jest wykonywany przez wirtualną maszynę Javy. Takich wirtualnych maszyn Javy stworzono wiele dla różnych systemów operacyjnych i komputerów. Dzięki temu rozwiązaniu i wspomnianej wcześniej ścisłej specyfikacji języka, można napisać program w Javie na przykład na komputerze domowym, skompilować go, przesłać skompilowaną jego postać na drugi koniec świata na duży komputer w centrum obliczeniowym i tam go wykonać. Efekt działania będzie taki sam.<ref>Zdarzają się wprawdzie także w Javie problemy z przenoszeniem oprogramowania, ale są one zwykle spowodowane nie niezgodnością samych maszyn wirtualnych, lecz specyficznymi cechami środowisk, w jakich te programy się uruchamia. Ale należy mocno podkreślić, o ile w przypadku większości języków programowania normą jest to, że uruchomienie programu na maszynie o innej architekturze wymaga co najmniej ponownego skompilowania programu, o tyle w przypadku Javy regułą jest to, że program działa na każdym komputerze tak samo, bez żadnych dodatkowych zabiegów.</ref>

Od wydania znakomitej książki o C przez Kernighana i Ritchiego stało się zwyczajem, by pierwszy prezentowany w danym języku program wypisywał pozdrowienie dla świata, nie wypada nam więc postąpić inaczej:

 public class HelloWorld { 
   public static void main(String[] args) {
     System.out.println("Hello world!");
   }
 }

Programy w Javie składają się z klas. Na razie przyjmijmy - w wielkim uproszczeniu - że klasa jest takim lepszym typem rekordowym z Pascala (czy typem struktur z C), zawierającym oprócz zwykłych pól także funkcje. W językach obiektowych funkcje zdefiniowane w klasach nazywamy metodami.

Przedstawiony program składa się z jednej klasy o nazwie HelloWorld. Definicja klasy rozpoczyna się od słowa class poprzedzonego być może dodatkowymi specyfikacjami dostępu (tu mamy jedną public, informującą kompilator, że nasza klasa jest dostępna także poza swoim pakietem, o pakietach powiemy dalej).<ref>W tym przykładzie słowo public przed deklaracją klasy można pominąć.</ref> Przedstawiona klasa zawiera tylko jedną składową, jest nią metoda o nazwie main. Ta nazwa metody nie jest przypadkowa. Wykonanie całego programu w Javie polega na wykonaniu metody main z głównej klasy programu (w naszym programie jest tylko jedna klasa, więc wybór klasy głównej nie nastręcza tu problemów).

Metoda main musi być przygotowana na przyjęcie jako argumentu tablicy napisów zawierającej argumenty podane w wierszu polecenia przy wywołaniu programu (nawet jeśli, tak jak przykładowa metoda, ignoruje te argumenty). Deklaracja parametrów metody wygląda bardzo podobnie jak w większości języków programowania. Podaje się sekwencję deklaracji poszczególnych parametrów (u nas ta sekwencja ma długość 1), a poszczególne deklaracje oddziela się jakimś separatorem (w Javie jest to akurat przecinek). Każda deklaracja określa nazwę i typ parametru (czasem też jakieś dodatkowe cechy parametru, jak na przykład sposób przekazywania - tak jest w Pascalu czy C# - ale w Javie nie ma takich dodatkowych informacji). W naszym przykładzie parametr nazywa się args a typem jego wartości jest String[], czyli tablica napisów, przy czym długość tablicy może być dowolna. Zwróćmy uwagę, że w Javie (tak jak w C i innych językach wywodzących się z C) najpierw podaje się typ, a potem nazwę parametru (choć to parametr, a nie typ, jest w tym miejscu definiowany).

Ponieważ w Javie wszystkie metody są funkcjami (a nie procedurami), należy jeszcze określić typ wyniku metody main. Tak pechowo się składa, że akurat ta metoda jest kiepskim kandydatem na funkcję, bo nie daje żadnego wyniku (w przeciwieństwie do funkcji main z C/C++). Tradycyjny trik stosowany w językach wywodzących się od C polega na definiowaniu takich funkcji jako funkcji o pustym zbiorze wyników. Typ reprezentujący pusty zbiór wartości nazywa się void. Typ wyniku metody podaje się w Javie (i wielu innych językach programowania) przed nazwą metody (niezgodnie niestety z tradycją matematyczną).

Przed typem metody podane są dodatkowe specyfikatory. Słowo public oznacza, że metoda jest widoczna poza klasą. Słowo static oznacza, że jest to metoda klasowa, czyli taka, do wywołania której nie jest potrzebny egzemplarz obiektu tej klasy. Tak jak wspominaliśmy wcześniej klasa odpowiada typowi, zaś wartości typu klasowego, egzemplarze tego typu, to obiekty. Zwykle wywołujemy metody obiektów, ale można też wywoływać metody klas. Jest to szczególnie istotne w naszym programie, gdzie nie utworzyliśmy żadnego obiektu.

Treść metody main składa się z jednego wywołania metody o nazwie println, wypisującej na konsoli tekstowej (czyli na standardowym wyjściu programów działających w trybie tekstowym), tekst zadany jako parametr. Wywołując metodę w Javie musimy podać obiekt, na rzecz którego tę metodę wywołujemy. W tym przypadku jest to obiekt out reprezentujący standardowy strumień wyjściowy (jest to obiekt klasy PrintStream). Obiekt ten jest atrybutem (polem w terminologii rekordów z Pascala) klasy System. W tej klasie zebrano podstawowe operacje i obiekty związany ze standardowym wejściem i wyjściem oraz z systemem operacyjnym, pod kontrolą którego działa program. Zwróćmy uwagę, że obiekt out jest atrybutem klasowym, to znaczy dostępnym bezpośrednio w klasie System, a nie jej egzemplarzach (których zresztą dla tej akurat klasy nie daje się tworzyć). W celu odwoływania się do metody lub atrybutu klasy w Javie stosuje się (typową dla większości języków obiektowych) notację kropkową:

 obiekt.składowa

gdzie składowa może być metodą (i wtedy podajemy jeszcze jej parametry otoczone nawiasami okrągłymi) lub atrybutem. Oczywiście możemy się dalej odwoływać do składowych atrybutu lub wyniku metody.

Komentarze

Komentarze jednowierszowe zaczynają się od dwu ukośników i rozciągają aż do końca wiersza.

 // To jest komentarz jednowierszowy

Komentarze wielowierszowe są ograniczone przez /* na początku i */ na końcu (oczywiście komentarz wielowierszowy może mieścić się całkowicie w jednym wierszu, może też nawet być kilka takich komentarzy w jednym wierszu).

 /* To jest 
    komentarz 
    wielowierszowy */
 /* A */ /* to */ /* kilka */ /* takich */ /* komentarzy */
 

Komentarzy wielowierszowych nie można zagnieżdżać jednych w drugich.

 /* To jest komentarz /* to nadal jest komentarz */ a_to_już_nie 

Elementy leksykalne Javy

Nie będziemy tu zbytnio wchodzić w szczegóły, odsyłając bardziej zainteresowanych czytelników do raportu języka. Pozwolimy sobie jedynie podsumować najważniejsze elementy leksykalne.

Identyfikatory

  • Identyfikatory składają się z liter i cyfr, znak "_" jest traktowany jako litera<ref>Także znak "$", ale nie powinno się go używać w zwykłych programach.</ref>,
  • Ponieważ Java używa używa kodowania znaków UniCode, to identyfikatory mogą zawierać znaki narodowe (w tym polskie),
  • Nie ma ograniczenia na długość identyfikatorów,
  • Identyfikatory nie mogą być słowami kluczowymi Javy ani literałami true, false i null.

Słowa kluczowe

Oto lista słów kluczowych Javy


abstract || continue || for || new || switch assert default if package synchronized boolean do goto private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while

Przypisy

<references/>