PO Wstęp do Javy

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

<<< 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/>