Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00322 007705 11223306 na godz. na dobę w sumie
Head First Java. Edycja polska (Rusz głową!) - książka
Head First Java. Edycja polska (Rusz głową!) - książka
Autor: , Liczba stron: 640
Wydawca: Helion Język publikacji: polski
ISBN: 83-7361-413-3 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> java - programowanie
Porównaj ceny (książka, ebook, audiobook).

Otwórz swój umysł. Poznaj język Java w niekonwencjonalny sposób. Nie będziesz musiał przebijać się przez długie wywody i czytać kilometrowych przykładów. Autorzy książki 'Head First Java. Edycja polska' wybrali inny sposób przedstawienia czytelnikom najpopularniejszego języka programowania ery internetu -- uniwersalnego, obiektowego, o prostej i czytelnej składni, a co najważniejsze -- dostępnego nieodpłatnie na wszystkich platformach systemowych i sprzętowych.

W 'Head First Java. Edycja polska' znajdziesz układanki, ilustrowane wyjaśnienia, zagadki oraz wywiady z najważniejszymi obiektami Javy. W ten nietypowy sposób nauczysz się zasad programowania zorientowanego obiektowo w języku Java. Z książki dowiesz się niemal wszystkiego -- zaczynając od zagadnień zupełnie podstawowych, a kończąc na bardzo zaawansowanych, takich jak wątki, połączenia sieciowe oraz programowanie rozproszone przy wykorzystaniu technologii RMI. Najważniejsze jest jednak to, że nauczysz się myśleć jak programista używający obiektowych języków programowania.

Jeśli chcesz poznać Javę i świetnie się przy tym bawić -- kup tę książkę.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

IDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ SPIS TREĎCI SPIS TREĎCI KATALOG KSI¥¯EK KATALOG KSI¥¯EK KATALOG ONLINE KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK TWÓJ KOSZYK DODAJ DO KOSZYKA DODAJ DO KOSZYKA CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE ZAMÓW INFORMACJE O NOWOĎCIACH O NOWOĎCIACH ZAMÓW CENNIK ZAMÓW CENNIK CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl Head First Java. Edycja polska Autorzy: Kathy Sierra, Bert Bates T³umaczenie: Piotr Rajca ISBN: 83-7361-413-3 Tytu³ orygina³u: Head First Java Format: B5, stron: 648 Przyk³ady na ftp: 102 kB Otwórz swój umys³. Poznaj jêzyk Java w niekonwencjonalny sposób. Nie bêdziesz musia³ przebijaæ siê przez d³ugie wywody i czytaæ kilometrowych przyk³adów. Autorzy ksi¹¿ki „Head First Java. Edycja polska” wybrali inny sposób przedstawienia czytelnikom najpopularniejszego jêzyka programowania ery internetu — uniwersalnego, obiektowego, o prostej i czytelnej sk³adni, a co najwa¿niejsze — dostêpnego nieodp³atnie na wszystkich platformach systemowych i sprzêtowych. W „Head First Java. Edycja polska” znajdziesz uk³adanki, ilustrowane wyjaġnienia, zagadki oraz wywiady z najwa¿niejszymi obiektami Javy. W ten nietypowy sposób nauczysz siê zasad programowania zorientowanego obiektowo w jêzyku Java. Z ksi¹¿ki dowiesz siê niemal wszystkiego — zaczynaj¹c od zagadnieñ zupe³nie podstawowych, a koñcz¹c na bardzo zaawansowanych, takich jak w¹tki, po³¹czenia sieciowe oraz programowanie rozproszone przy wykorzystaniu technologii RMI. Najwa¿niejsze jest jednak to, ¿e nauczysz siê myġleæ jak programista u¿ywaj¹cy obiektowych jêzyków programowania. • Podstawowe informacje o jêzyku Java • Klasy i obiekty • Typy danych • Pierwszy program w Javie • Java API • Programowanie obiektowe — dziedziczenie, polimorfizm, interfejsy i klasy abstrakcyjne • Metody • Obs³uga wyj¹tków • Graficzny interfejs u¿ytkownika • Operacje wejġcia-wyjġcia • Programowanie sieciowe i RMI Jeġli chcesz poznaæ Javê i ġwietnie siê przy tym bawiæ — kup tê ksi¹¿kê. rozdz_00_p1.qxd 2004-11-05 14:45 Page 5 Spis treści (skrócony) Wprowadzenie 1. Przełamując zalew początkowych trudności — szybki skok na głęboką wodę 2. Wycieczka do Obiektowa — tak, tam będą same obiekty 3. Poznaj swoje zmienne — typy podstawowe i referencje 4. Jak działają obiekty — stan obiektu wpływa na działanie metod 5. Supermocne metody — sterowanie przepływem, operacje i nie tylko 6. Korzystanie z biblioteki Javy — nie musisz pisać tego sam 7. Wygodniejsze życie w Obiektowie — planowanie swojej przyszłości 8. Poważny polimorfizm — wykorzystanie abstrakcyjnych klas i interfejsów 9. Życie i śmierć obiektu — konstruktory i zarządzanie pamięcią 10. Liczby mają znaczenie — klasa Math, formatowanie, klasy „opakowujące” i składowe statyczne 11. Ryzykowne działania — obsługa wyjątków 12. Historia bardzo graficzna — wprowadzenie do GUI, obsługi zdarzeń i klas wewnętrznych 13. Popracuj nad Swingiem — menedżery rozkładu i komponenty 14. Zapisywanie obiektów — serializacja i operacje wejścia-wyjścia 15. Nawiąż połączenie — połączenia sieciowe i wielowątkowość 16. Rozpowszechnij swój kod — pakowanie i publikowanie 17. Przetwarzanie rozproszone — RMI z odrobinką serwletów, EJB i Jini A Ostatnie doprawianie kodu B Dziesięć najważniejszych zagadnień, które niemal znalazły się w tej książce... Skorowidz 17 27 51 73 95 119 147 185 217 255 293 321 357 403 431 471 529 553 595 605 625 w Spis treści (na serio) Wprowadzenie Twój mózg myśli o Javie. W tym rozdziale Ty próbujesz się czegoś dowiedzieć, natomiast Twój mózg robi Ci uprzejmość i stara się, aby te informacje nie zostały zapamiętane na długo. Myśli sobie: „Lepiej zostawić miejsce na ważniejsze rzeczy, takie jak dzikie zwierzęta, których należy się wystrzegać, lub rozważania, czy jeżdżenie na snowboardzie w stroju Adama to dobry pomysł”. A zatem jak można oszukać własny mózg i przekonać go, że od znajomości Javy zależy nasze życie? Dla kogo jest przeznaczona ta książka? Co sobie myśli Twój mózg? Metapoznanie Zmuś swój mózg do posłuszeństwa Czego potrzebujesz, aby skorzystać z tej książki? 18 19 21 23 24 5 rozdz_00_p1.qxd 2004-11-05 14:45 Page 6 1 Przełamując zalew początkowych trudności Java zabiera nas w nowe miejsca. Od momentu pojawienia się pierwszej, skromnej wersji o numerze 1.02, Java pociągała programistów ze względu na przyjazną składnię, cechy obiektowe, zarządzanie pamięcią, a przede wszystkim obietnicę przenośności. Od samego początku „wskoczymy na głęboką wodę” — napiszemy prosty program, skompilujemy go i wykonamy. Porozmawiamy o składni, pętlach, rozgałęzieniach oraz innych czynnikach, które sprawiają, że Java jest taka fajna. Zatem, wskakuj! Jak działa Java? Struktura kodu w Javie Anatomia klasy Metoda main() Pętle Rozgałęzienia warunkowe (test if) Tworzenie aplikacji „99 butelek piwa” Program krasomówczy Pogawędki przy kominku — spór kompilatora z JVM Ćwiczenia i zagadki 28 31 32 33 35 37 38 41 42 44 maszyny wirtualne skompilowany kod bajtowy 2 Wycieczka do Obiektowa Mówiono mi, że będą tam same obiekty. W rozdziale 1. cały kod programu został umieszczony w metodzie main(). Nie jest to w pełni zgodne z zasadami programowania obiektowego. A zatem trzeba porzucić świat programowania proceduralnego i rozpocząć tworzenie własnych obiektów. Zobaczymy, co sprawia, że programowanie obiektowe w Javie jest takie fajne. Wyjaśnimy także, na czym polega różnica pomiędzy klasą a obiektem. W końcu pokażemy, w jaki sposób obiekty mogą ułatwić nam życie. Wojna o fotel (Jurek „obiektowiec” kontra Bronek „proceduralny”) Dziedziczenie (wprowadzenie) Przesłanianie metod (wprowadzenie) Czym jest klasa? (metody, składowe) Tworzenie pierwszego obiektu Użycie metody main() Kod od kuchni Ćwiczenia i zagadki 52 55 56 58 60 62 63 66 jedna klasa wiele obiektów 6 rozdz_00_p1.qxd 2004-11-05 14:45 Page 7 3 Poznaj swoje zmienne Istnieją dwa rodzaje zmiennych: zmienne typów podstawowych oraz odwołania. W programach będą istnieć także inne typy danych niż jedynie liczby całkowite, łańcuchy znaków i tablice. Co zrobić, jeśli chcielibyśmy stworzyć obiekt WłaścicielZwierzaka zawierający składową Pies? Albo Pojazd ze składową Silnik? W tym rozdziale ujawnimy tajemnice typów danych w Javie oraz pokażemy, co można zadeklarować jako zmienną, zapisać w zmiennej oraz co z taką zmienną można potem zrobić. W końcu przekonamy się, jak wygląda życie na automatycznie porządkowanej stercie. Deklarowanie zmiennej (Java zwraca uwagę na typ) Typy podstawowe („Poproszę podwójne z dodatkową pianką”) Słowa kluczowe Javy Odwołania (zdalne sterowanie obiektami) Deklarowanie i przypisywanie obiektów Obiekty na automatycznie sprzątanej stercie Tablice (pierwszy rzut oka) Ćwiczenia i zagadki 74 75 77 78 79 81 83 87 obiekt P i e s odwołanie do obiektu Pies 4 Jak działają obiekty? Stan wpływa na działanie, a działanie wpływa na stan. Wiemy, że obiekty mają swój stan i określone działanie reprezentowane odpowiednio przez składowe i metody. Teraz sprawdzimy, w jaki sposób stan i działanie obiektów są ze sobą powiązane. Otóż w swych działaniach obiekty wykorzystują swój unikalny stan. Innymi słowy, metody wykorzystują wartości składowych obiektów. Na przykład: „Jeśli pies waży mniej niż 20 kilo, szczekamy radośnie, w przeciwnym przypadku…”. Spróbujmy zmienić stan obiektu! przekazywanie przez wartość oznacza przekazywanie przez kopię kopia x 1 1 1 0 0 0 0 0 00000111 X int Z int pmc.idz(x) idz(int z) Metody wykorzystują stan obiektu (obiektowy pies szczeka inaczej) Argumenty metod i typy zwracanych wartości Przekazywanie przez wartość (zmienna zawsze jest kopiowana) Metody pobierające i zapisujące Hermetyzacja (użyj jej lub zaryzykuj upokorzenie) Wykorzystanie odwołań w tablicy Ćwiczenia i zagadki 97 98 101 103 104 107 112 7 rozdz_00_p1.qxd 2004-11-05 14:45 Page 8 5 S t w o r z y m y g r ę Z a t o p i ć p o r t a l Supermocne metody Dodajmy naszym metodom nieco siły. Zajmowaliśmy się już zmiennymi, eksperymentowali z kilkoma obiektami i napisali kod paru programów. Jednak potrzeba nam więcej narzędzi. Na przykład operatorów. I pętli. Może przydałoby się wygenerować kilka liczb losowych i zamienić łańcuch znaków na liczbę całkowitą. O tak, to byłoby super. I dlaczego nie zajmiemy się stworzeniem prawdziwego programu, aby zobaczyć (i doświadczyć), jak wygląda kodowanie w Javie? Może jakąś grę, taką jak „Zatopić portal” (podobną do gry w okręty). Tworzenie gry Zatopić portal Rozpoczynanie pracy nad prostą wersją gry Zatopić portal Pisanie kodu przygotowawczego (pseudokodu gry) Kod testowy prostej wersji gry Pisanie kodu prostej wersji gry Ostateczny kod prostej wersji gry Zatopić portal Generowanie liczb losowych przy użyciu Math.random() Gotowy kod do pobierania danych wpisywanych w wierszu poleceń Realizacja cykliczna przy użyciu pętli for Rzutowanie dużych typów prostych na mniejsze Konwersje łańcuchów znaków na liczby przy użyciu Integer.parseInt() Ćwiczenia i zagadki 120 122 123 126 127 130 135 136 138 140 140 141 6 Korzystanie z biblioteki Javy Java jest wyposażona w setki gotowych klas. Jeśli tylko dowiesz się, jak znaleźć w bibliotece Javy (nazywanej także Java API) to, czego szukasz, nie będziesz musiał ponownie wymyślać koła. W końcu masz ciekawsze rzeczy do roboty. Jeśli masz zamiar napisać program, to równie dobrze możesz napisać tylko te jego fragmenty, które są unikalne. Standardowa biblioteka Javy to gigantyczny zbiór klas, które tylko czekają, aby użyć ich jako klocków przy tworzeniu programów. „Jak to dobrze, że w pakiecie java.util dostępna jest klasa ArrayList. Ale jak mógłbym się o tym sam dowiedzieć?” — Julian, 31 lat, model Analizowanie błędu w prostej wersji gry Zatopić portal ArrayList (wykorzystanie Java API) Poprawa kodu klasy Portal Tworzenie właściwej wersji gry (Zatopić portal) Pseudokod właściwej wersji gry Kod właściwej wersji gry Wyrażenia logiczne (boolowskie) Korzystanie z biblioteki (Java API) Korzystanie z pakietów (instrukcja importu i pełne nazwy) Korzystanie z dokumentacji w wersji HTML i literatury Ćwiczenia i zagadki 148 154 160 162 166 168 173 176 177 180 182 8 rozdz_00_p1.qxd 2004-11-05 14:45 Page 9 7 Wygodniejsze życie w Obiektowie Planuj swoje programy, myśląc o przyszłości. A gdyby tak można tworzyć kod, który inni programiści mogliby rozbudowywać, i to w prosty sposób? A gdyby tak można było tworzyć elastyczny kod z myślą o tych najnowszych zmianach wprowadzanych w specyfikacji Javy? Kiedy dowiesz się o planie polimorficznym, poznasz 5 kroków służących projektowaniu lepszych klas, 3 sztuczki z polimorfizmem oraz 8 sposobów tworzenia elastycznego kodu, a jeśli zaczniesz już teraz, dodatkowo otrzymasz 4 podpowiedzi odnośnie wykorzystywania dziedziczenia. Zrozumienie dziedziczenia (relacje między klasami nadrzędnymi i podrzędnymi) Projektowanie drzewa dziedziczenia (symulacja na zwierzętach) Unikanie powielania kodu (przy wykorzystaniu dziedziczenia) Przesłanianie metod JEST i MA (dziewczyna z wanną) Co dziedziczysz po klasie nadrzędnej? Co w rzeczywistości daje nam dziedziczenie? Polimorfizm (używanie odwołania klasy nadrzędnej do obiektu klasy podrzędnej) Reguły przesłaniania (nie dotykaj tych argumentów i typu wartości wynikowej) Przeciążanie metody (powtórnie użyta nazwa metody, nic więcej) Ćwiczenia i zagadki 188 190 191 192 197 200 202 203 210 211 213 8 Poważny polimorfizm Dziedziczenie to tylko początek. Aby w pełni wykorzystać polimorfizm, niezbędne nam będą interfejsy. Musimy pójść dalej, poza proste dziedziczenie, i uzyskać elastyczność, jaką może zapewnić wyłącznie projektowanie i kodowanie z wykorzystaniem interfejsów. Czym jest interfejs? W 100 abstrakcyjną klasą. A czym jest klasa abstrakcyjna? To klasa, która nie pozwala na tworzenie obiektów. A co nam po takiej klasie? Przeczytaj, to się dowiesz… Object o = al.pobierz(id); Pies d = (Pies) o; d.szczekaj() Object s obiekt P i e rzutujemy Object na obiekt Pies, o którym wiemy że jest tutaj. Object Pies Obiektów niektórych klas po prostu nie należy tworzyć Klasy abstrakcyjne (nie dają możliwości tworzenia obiektów) Metody abstrakcyjne (muszą zostać zaimplementowane) Polimorfizm w działaniu Klasa Object (ostateczna klasa nadrzędna) Odczytywanie obiektów z listy ArrayList (są odczytywane jako Object) Kompilator sprawdza typy odwołań (nim pozwoli na wywołanie metody) Połącz się ze swoim wewnętrznym Obiect-em Odwołania polimorficzne Rzutowanie odwołania do obiektu (przesuwanie się w dół drzewa dziedziczenia) „Śmiertelny romb” (problem wielokrotnego dziedziczenia) Wykorzystanie interfejsów (najlepsze rozwiązanie!) Ćwiczenia i zagadki 220 221 223 226 228 231 233 234 235 236 243 244 249 9 rozdz_00_p1.qxd 2004-11-05 14:45 Page 10 9 Życie i śmierć obiektu Obiekty się rodzą i umierają. To Ty jesteś za to odpowiedzialny. To Ty decydujesz, kiedy i jak skonstruować obiekt. Ty także decydujesz, kiedy go porzucić. Odśmiecacz pamięci odzyska pamięć zajmowaną przez niepotrzebne obiekty. Przyjrzymy się, w jaki sposób obiekty są tworzone, gdzie „żyją” i w jaki sposób efektywnie je przechowywać lub porzucać. Oznacza to, że będziemy dyskutować o stercie, stosie, zasięgach, konstruktorach, konstruktorach nadrzędnych, odwołaniach pustych oraz przydatności odśmiecacza pamięci. Kiedy ktoś wywołuje metodę nowa(), bieżący obiekt Kaczka jest porzucany. Jedyne odwołanie wskazujące na ten obiekt zostało zmodyfikowane i aktualnie wskazuje inny obiekt Kaczka. o biekt K a czka o biekt K a czka S t a t r e Zmiennej „d“ jest przypisywany nowy obiekt Kaczka, przez co oryginalny (poprzedni) obiekt zostaje porzucony. Następnie oryginalna Kaczka zostaje upieczona. Stos i sterta, gdzie mieszkają zmienne i obiekty Metody na stosie Gdzie są przechowywane zmienne lokalne? Gdzie są przechowywane składowe? Cud uworzenia obiektu Konstruktory (kod wykonywany, gdy powiemy: „Stań się”) Inicjalizacja stanu nowego obiektu Kaczka Kompilator potrafi stworzyć konstruktor domyślny (bezargumentowy) Konstruktory przeciążone Konstruktory klas nadrzędnych (łańcuch wywołań konstruktorów) Wywoływanie przeciążonych konstruktorów przy użyciu this() Istnienie obiektu Odśmiecanie (i zapewnianie przydatności obiektu) Ćwiczenia i zagadki 256 257 258 259 260 261 263 265 267 270 276 278 280 287 10 Zmienne statyczne są współdzielone przez wszystkie kopie klasy P i e r w s z a k o p i a o b i e k t u D z i e c i a k zmienna statyczna: Lody Liczby mają znaczenie Zabaw się w matematyka. Java API udostępnia metody do wyznaczania wartości bezwzględnej, zaokrąglania liczb, określania wartości minimalnej i maksymalnej i tak dalej. A co z formatowaniem? Moglibyśmy chcieć wyświetlać liczby ze znakiem dolara na początku i dwoma miejscami dziesiętnymi. Albo wyświetlić daną w formie daty. Albo daty w zapisie stosowanym w Anglii. A co z przekształcaniem łańcucha znaków na liczbę? Lub zamianą liczby na łańcuch znaków? Zaczniemy jednak od wyjaśnienia, co oznacza, że zmienne lub właściwości są statyczne, omówimy także stałe w Javie — statyczne zmienne sfinalizowane. Klasa Math (czy naprawdę potrzeba nam obiektu tej klasy?) Metody statyczne Zmienne statyczne Stałe (statyczne zmienne sfinalizowane) Metody klasy Math (random(), round(), abs() i inne) Klasy „opakowujące” (Integer, Boolean, Character itd.) Formatowanie liczb Formatowanie dat Ćwiczenia i zagadki 294 295 297 302 306 307 310 312 315 Druga kopia obiektu Dzieciak Właściwości: po jednej w kopii obiektu Zmienne statystyczne: Po jednej w całej klasie 10 rozdz_00_p1.qxd 2004-11-05 14:45 Page 11 11 Ryzykowne działania Czasami zdarzają się nieprzewidziane sytuacje. Pliku nie ma tam, gdzie powinien być. Serwer został wyłączony. Niezależnie od tego, jak dobrym jesteś programistą, nie jesteś w stanie kontrolować wszystkiego. Kiedy tworzysz metodę, której działanie jest opatrzone ryzykiem niepowodzenia, musisz także stworzyć kod, który obsłuży potencjalnie niebezpieczną sytuację. Ale skąd wiadomo, że metoda może nieść ze sobą potencjalne niebezpieczeństwo? Gdzie umieszczać kod obsługujący wyjątkowe sytuacje? W tym rozdziale stworzymy odtwarzacz MIDI wykorzystujący ryzykowny interfejs programistyczny JavaSound, zatem lepiej dowiedzmy się, jak zabezpieczyć się przed potencjalnymi niebezpieczeństwami. p d o w o w i e d z i zgłaszany jestwyjąte k wywołanie potencjalnie niebezpiecznej metody Twój kod klasa zawierająca potencjalnie niebezpieczną metodę Tworzenie maszyny muzycznej (MuzMachina) A co, jeśli trzeba wywołać potencjalnie niebezpieczny kod? Wyjątki informują, że „mogło się stać coś złego” Kompilator gwarantuje (sprawdza), że będziesz świadom zagrożeń Przechwytywanie wyjątków przy użyciu try-catch (deskorolkarz) Sterowanie przepływem w blokach try-catch Blok finally (niezależnie od tego, co się dzieje, wyłącz piekarnik!) Przechwytywanie wielu wyjątków (kolejność ma znaczenie) Deklarowanie wyjątków (pomiń go) Prawo obsługuj lub deklaruj Kod od kuchni (generowanie dźwięków) Ćwiczenia i zagadki 322 325 326 327 328 332 333 335 341 343 345 354 12 Historia bardzo graficzna Musisz się z tym pogodzić — tworzenie interfejsów graficznych jest konieczne. Nawet jeśli wierzysz, że już do końca życia będziesz pisać programy działające na serwerze, to jednak będziesz także musiał pisać programy narzędziowe i zapewne będziesz chciał, aby miały one jakiś interfejs graficzny. Zagadnieniom interfejsu graficznego poświęcimy dwa rozdziały, w których przedstawimy także inne cechy języka, takie jak obsługa zdarzeń oraz klasy wewnętrzne. Naciśniemy przycisk na ekranie, wskażemy coś myszą, wyświetlimy obraz zapisany w formacie JPEG, a nawet stworzymy małą animację. Teraz obiekt zewnętrzny i wewnętrzny są połączone w sposób intymny. T e d w a o b i e k t y n a s t e r c i e s ą p o ł ą c z o n e w s p o s ó b s z c z e g ó l n y . O b i e k t w e w n ę t r z n y m a d o s t ę p d o w ł a ś c i w o ś c i o b i e k t u z e w n ę t r z n e g o ( i n a o d w r ó t ) wewnę t r zew n ę trzny z ny Twój pierwszy interfejs graficzny Przechwytywanie zdarzeń generowanych przez użytkownika Implementacja interfejsu odbiorcy Przechwytywanie zdarzenia ActionEvent przycisku Tworzenie interfejsu użytkownika wykorzystującego grafikę Zabawa z metodą paintComponent() Obiekt Graphics2D Umieszczanie na ekranie więcej niż jednego przycisku Pomoc ze strony klas wewnętrznych (stwórz odbiorcę jako klasę wewnętrzną) Animacja (przesuń to, narysuj to, przesuń to, narysuj to i tak dalej) Kod od kuchni (rysowanie przy dźwiękach muzyki) Ćwiczenia i zagadki 359 361 362 364 367 369 370 376 382 386 390 398 11 rozdz_00_p1.qxd 2004-11-05 14:45 Page 12 13 Popracuj nad Swingiem Swing jest łatwy. Chyba że naprawdę zwracasz uwagę na to, co jest gdzie wyświetlane. Kod wykorzystujący Swing wydaje się prosty, ale kiedy go skompilujesz, uruchomisz i popatrzysz na wyniki, to często będziesz mógł sobie pomyśleć: „Hej, przecież to nie miało być wyświetlone w tym miejscu”. To, co zapewnia prostotę kodu, sprawia jednocześnie, że trudne jest kontrolowanie położenia elementów — tym „czymś” jest menedżer układu. Jednak przy odrobinie pracy można nagiąć menedżer układu do naszej woli. W tym rozdziale popracujemy nad naszym Swingiem i dowiemy się czegoś więcej o różnych elementach graficznych. K om p o n e n t y n a w s c h o d z i e i z a c h o d z i e m a j ą p r e f e r ow a n ą w i e l k o ś ć . Także komponenty na północy i południu mają preferowaną wielkość. Element centralny dostosowuje się do obszaru pozostawionego przez pozostałe cztery elementy. Komponenty biblioteki Swing Menedżery układu (kontrolują wielkość i rozmieszczenie) Trzy menedżery układu (BorderLayout, FlowLayout, BoxLayout) BorderLayout (zarządza pięcioma regionami) FlowLayout (zwraca uwagę na kolejność i preferowaną wielkość) BoxLayout (podobny do poprzedniego, lecz może rozmieszczać elementy w pionie) JTextField (służy do wpisywania pojedynczego wiersza tekstu) JTextArea (służy do wpisywania wielu wierszy tekstu i ma możliwość jego przewijania) JCheckBox (czy ta opcja jest wybrana?) JList (lista elementów z możliwością przewijania) Kod od kuchni (coś wielkiego — tworzenie klienta pogawędek aplikacji MuzMachina) 404 405 407 408 412 415 417 418 420 421 422 428 14 Ćwiczenia i zagadki Zapisywanie obiektów Obiekty można pakować i odtwarzać. Obiekty mają swój stan i działanie. Działanie obiektu określa jego klasa, natomiast stan zależy od konkretnego obiektu. Jeśli program musi zapisać stan obiektu, możesz to zrobić w sposób trudny — analizując każdy obiekt i pracowicie zapisując wartości wszystkich właściwości. Możesz także zapisać obiekt w sposób łatwy i obiektowy — „zamrażając” obiekt (przeprowadzając jego serializację), a następnie odtwarzając (poprzez jego deserializację). obiekt po serializacji jakieś pytania? obiekt po deserializacji 12 Stan obiektów biblioteki Swing Zapisywanie zserializowanego obiektu do pliku Strumienie wejścia-wyjścia w Javie Serializacja obiektów Implementacja intefejsu Serializable Stosowanie zmiennych pomijanych podczas serialiacji Deserializacja obiektów Zapis zawartości pliku tekstowego java.io.File Odczyt zawartości pliku tekstowego StringTokenizer Kod od kuchni Ćwiczenia i zagadki 433 434 437 438 439 441 443 447 452 454 458 462 466 rozdz_00_p1.qxd 2004-11-05 14:45 Page 13 15 Nawiąż połączenie Nawiąż połączenie ze światem zewnętrznym. To takie łatwe. Wszelkie szczegóły związane z komunikacją sieciową na niskim poziomie są obsługiwane przez klasy należące do biblioteki java.net. Jedną z najlepszych cech Javy jest to, iż wysyłanie i odbieranie danych przez sieć to w zasadzie normalne operacje wejścia-wyjścia, z tą różnicą, że są w nich wykorzystywane nieco inne strumienie. W tym rozdziale stworzymy gniazda używane przez programy klienckie. Stworzymy także gniazda używane przez programy pełniące funkcje serwerów. Napiszemy zarówno program klienta, jak i serwera. Zanim skończysz czytać ten rozdział, będziesz już dysponować w pełni funkcjonalnym, wielowątkowym programem do prowadzenia internetowych pogawędek. Zaraz… czy właśnie padło słowo wielowątkowy? Połączenie z portem 5000 na serwerze o adresie 196.164.1.103 klient serwer P o ł ą c z e n i e z k l i e n t em o a d r e s i e 1 9 6 . 1 6 4 . 1 . 1 0 0 n a p o r c i e 4 2 4 2 Ogólne omówienie programu klienta Nawiązywanie połączenia, wysyłanie i odbieranie Gniazda sieciowe Porty TCP Odczytywanie danych z gniazda (przy użyciu BufferedReader) Zapisywanie danych w gnieździe (przy użyciu PrintWriter) Pisanie programu CodziennePoradyKlient Tworzenie prostego serwera Kod aplikacji CodziennePoradySerwer Tworzenie klienta pogawędek Wiele stosów wywołań Uruchamianie nowego wątku (utworzenie i rozpoczęcie działania) Interfejs Runnable (zadanie, jakie wątek ma wykonać) Trzy stany nowego obiektu Thread (nowy, uruchamialny, działający) Pętla działania Mechanizm szeregowania wątków (to on decyduje, a nie Ty) Usypianie wątku Tworzenie i uruchamianie dwóch wątków Zagadnienia współbieżności — czy te problemy można rozwiązać? Problem współbieżności Romka i Moniki Blokowanie w celu stworzenia elementów atomowych Każdy obiekt ma blokadę Przerażający problem „utraconej modyfikacji” Metody synchronizowane (przy użyciu blokowania) Wzajemna blokada! Kod wielowątkowego klienta pogawędek Gotowy do użycia ProstyKlientPogawedek Ćwiczenia i zagadki 473 474 475 476 478 479 480 483 484 486 490 492 493 495 496 497 501 503 505 506 510 511 512 514 516 518 520 524 13 rozdz_00_p1.qxd 2004-11-05 14:45 Page 14 16 Rozpowszechnij swój kod Już czas wypłynąć na „szerokie wody”. Napisałeś kod swojej aplikacji. Przetestowałeś go. Udoskonaliłeś. Powiedziałeś wszystkim znajomym, że świetnie by było, gdybyś już w życiu nie musiał napisać choćby jednej linijki kodu. Ale w końcu stworzyłeś dzieło sztuki. Przecież Twoja aplikacja działa! W ostatnich dwóch rozdziałach książki zajmiemy się zagadnieniami związanymi z organizowaniem, pakowaniem i wdrażaniem kodu. Przyjrzymy się możliwościom wdrażania lokalnego, mieszanego i zdalnego, w tym wykonywalnym plikom Jar, technologii Java Web Start, RMI oraz serwletom. Nie stresuj się! Niektóre z najbardziej niesamowitych rozwiązań, jakimi może się poszczycić Java, są prostsze, niż można by przypuszczać. Możliwości wdrażania Niezależne przechowywanie kodu źródłowego i plików klasowych Tworzenie wykonywalnych plików JAR (archiwów Javy) Uruchamianie wykonywalnych plików JAR Umieszczaj swoje klasy w pakietach! Zapobieganie konfliktom nazw pakietów Pakietom musi odpowiadać odpowiednia struktura katalogów Kompilacja i uruchamianie programu, w którym wykorzystywane są pakiety Kompilacja z opcją -d Tworzenie wykonywalnych plików JAR (z wykorzystaniem pakietów) Wdrażanie przez internet przy użyciu technologii JWS (ang. Java Web Start) Plik .jnlp Jak tworzyć i wdrażać aplikacje JWS? Ćwiczenia i zagadki 530 532 533 534 535 536 537 538 539 540 545 547 548 549 MojaApl.jar MojaApl.class MojaApl.jar 17 Przetwarzanie rozproszone Zdalne wykonywanie aplikacji nie zawsze jest złe. Oczywiście to prawda, że życie jest łatwiejsze, gdy wszystkie elementy aplikacji znajdują się w jednym miejscu i są zarządzane przez jedną wirtualną maszynę Javy. Jednak takie rozwiązanie nie zawsze jest możliwe. Co w sytuacji, gdy aplikacja realizuje bardzo złożone obliczenia? Co, jeśli potrzebuje informacji pochodzących z zabezpieczonej bazy danych? W tym rozdziale przedstawiona zostanie zadziwiająco prosta technologia wywoływania zdalnych metod — RMI (ang: Remote Method Invocation). Pobieżnie przyjrzymy się także innym rozwiązaniom — serwletom, komponentom EJB (ang. Enterprise Java Bean) oraz technologii Jini. KKlliieenntt SSeerrwweerr i k obi e k t u szkielet RMI p o mocnik u s ługi obiekt u s ługi pośrednik RMI omoc n klient a p o biektklie n t a 14 Wywoływanie zdalnych metod (RMI), bardzo szczegółowy opis praktyczny Serwlety (pobieżna prezentacja) Enterprise JavaBeans (komponenty EJB, bardzo pobieżna prezentacja) Jini, najlepsza z możliwych sztuczek Tworzenie naprawdę fajnej, uniwersalnej przeglądarki usług Koniec 554-570 571 577 578 582 594 rozdz_00_p1.qxd 2004-11-05 14:45 Page 15 A Dodatek A Ostatnie doprawianie kodu. Kompletny kod aplikacji MuzMachina w ostatecznej wersji klient-serwer z możliwością prowadzenia muzycznych pogawędek. MuzMachinaKońcowa (kod klienta) SerwerMuzyczny (kod serwera) 596 603 B Dodatek B Dziesięć najważniejszych zagadnień, które niemal znalazły się w tej książce... Jeszcze nie możemy Cię zostawić i wypuścić w świat. Mamy dla Ciebie jeszcze kilka dodatkowych informacji, jednak to już jest koniec tej książki. I tym razem mówimy to zupełnie serio. Operacje bitowe Niezmienność Asercje Zasięg blokowy Połączone wywołania Przesłanianie metody equals() Poziomy dostępu oraz modyfikatory dostępu (czyli co kto widzi) Metody klas String oraz StringBuffer Tablice wielowymiarowe Kolekcje 606 607 608 609 610 611 612 614 615 616 625 15 Skorowidz S rozdz_01_v4.qxd 2004-11-01 23:48 Page 27 Rozdział 1. Szybki skok na głęboką wodę Przełamując zalew początkowych trudności Wskakujcie, woda jest świetna! Napiszemy nieco kodu, skompilujemy go i uruchomimy. Porozmawiamy także trochę o składni, o pętlach, rozgałęzieniach oraz innych sprawach, które sprawiają, że Java jest taka fajna. Zanim się obejrzycie już będziecie pisać programy. Java zabiera nas w nowe miejsca. Od momentu pojawienia się pierwszej, skromnej wersji o numerze 1.02, Java pociągała programistów ze względu na przyjazną składnię, cechy obiektowe, zarządzanie pamięcią, a przede wszystkim obietnicę przenośności. Pokusa, jaką niesie ze sobą hasło „napisz raz — uruchamiaj wszędzie”, jest po prostu zbyt duża. Nagle pojawiło się wielu oddanych użytkowników Javy, choć programiści walczyli z błędami, ograniczeniami i, a także, faktem, że język był strasznie wolny. Ale tak było wieki temu. Jeśli właśnie zaczynasz naukę i korzystanie z Javy, masz szczęście. Niektórzy z nas musieli brnąć 10 kilometrów w śniegu, w obie strony pod górę (i to boso), aby uruchomić nawet najprostszy aplet. Ale Ty, Ty masz do dyspozycji udoskonaloną, szybszą i o niebo potężniejszą, nowoczesną wersję języka. — pionierzy Javy nie mieli do dyspozycji tej książki. Cóż, było im trudniej. I pamiętaj to jest nowy rozdział 27 rozdz_01_v4.qxd 2004-11-01 23:48 Page 28 Jak dziala Java? Jak działa Java? Naszym celem jest napisanie jednej aplikacji (w tym przykładzie będą to interaktywne zaproszenia na imprezę) i zagwarantowanie, aby mogła ona działać na dowolnych urządzeniach, które posiadają Twoi przyjaciele. kod źródłowy ❶ Stworzenie dokumentu źródłowego. Wykorzystywany jest przy tym określony protokół (w tym przypadku — język Java). kompilator ❷ Przetworzenie dokumentu przy użyciu kompilatora kodu źródłowego. Kompilator sprawdza, czy w programie nie ma błędów, i nie dopuści do jego skompilowania aż do momentu, gdy uzyska pewność, że program będzie działać dobrze. kod wynikowy ❸ Kompilator tworzy nowy dokument, którego zawartość stanowi skompilowany kod bajtowy Javy. Java będzie w stanie zinterpretować (lub przetłumaczyć) ten dokument do postaci, którą będzie w stanie wykonać. Skompilowany kod bajtowy są niezależne od platformy systemowej. maszyny wirtualne ❹ Twoi przyjaciele nie mają fizycznej maszyny Javy, dysponują jednak maszynami wirtualnymi (zaimplementowanymi w formie programów) działającymi w różnego typu gadżetach elektronicznych. Te wirtualne maszyny odczytują i wykonują kody bajtowe. 28 Rozdział 1 rozdz_01_v4.qxd 2004-11-01 23:48 Page 29 Szybki skok na głęboką wodę Co będziemy robić w Javie? Napiszemy plik zawierający kod źródłowy, skompilujemy go, wykorzystując w tym celu kompilator javac, a następnie wykonamy skompilowany kod bajtowy przy użyciu wirtualnej maszyny Javy. kompilator ❷ Skompiluj plik Impreza.java, uruchamiając program javac (czyli kompilator). Jeśli nie pojawią się żadne błędy, wygenerowany zostanie drugi plik o nazwie Impreza.class. Wygenerowany przez kompilator plik Impreza.class zawiera kody bajtowe. kod źródłowy ❶ Wpisz kod źródłowy. Zapisz go jako Impreza.java. kod wynikowy ❸ Skompilowany kod: Impreza.class. maszyny wirtualne ❹ Wykonaj program, uruchamiając w tym celu wirtualną maszynę Javy (ang. Java Virtual Machine, w skrócie JVM) i przekazując do niej plik Impreza.class. Wirtualna maszyna Javy przekształca kod bajtowy na polecenia, które jest w stanie zrozumieć system komputerowy, w jakim działa, a następnie wykonuje program. jesteś tutaj(cid:23) 29 rozdz_01_v4.qxd 2004-11-01 23:48 Page 30 Historia Javy? Krótka historia Javy 2500 2250 2000 1750 1500 1250 1000 750 500 250 100 y v a J e c e t o i l b i b j e w o d r a d n a t s w s a l k ć ś o l I Java 1.02 250 klas Wolna Fajna nazwa i logo. Jej używanie dawało dużo radości. Masa błędów. Zdecydowanie najciekawsze są aplety. Java 1.1 500 klas Nieco szybsza Więcej możliwości, nieco bardziej przyjazna dla programistów. Staje się bardzo popularna. Lepszy kod do obsługi graficznego interfejsu użytkownika (GUI). Java 2 (wersja 1.4 i wyższe) 2300 klas (Java 1.4) Dużo szybsza; może (czasami) działać z szybkością dorównująca szybkości działania programów kompilowanych do postaci kodu natywnego. Poważny język programowania o ogromnych możliwościach. Dostępna w trzech wersjach: Micro Edition (J2ME), Standard Edition (J2SE) oraz Enterprise Edition (J2EE). Stała się preferowanym językiem dla aplikacji biznesowych i internetowych. Zobacz, jak łatwo jest napisać program w Javie. int wielkosc = 27; String imie = Azorek ; Pies mojPies = new Pies(imie, wielkosc); x = wielkosc - 5; if (x 25) mojPies.szczekaj(8); while (x 3) { mojPies.zabawa(); } 30 Rozdział 1 Zaostrz ołówek Czy potrafisz określić, do czego służą poszczególne wiersze kodu? Deklaruje zmienną całkowitą o nazwie „wielkosc” i przypisuje jej wartość 27. Hej, ruszcie głowami! rozdz_01_v4.qxd 2004-11-01 23:48 Page 31 Struktura kodu w Javie Szybki skok na głęboką wodę plik źródłowy klasa metoda 1 instrukcja metoda 2 instrukcja instrukcja Umieść definicję klasy w pliku źródłowym. W klasie umieść definicje metod. W metodach umieść instrukcje. Co się umieszcza w pliku źródłowym? Plik źródłowy (ten z rozszerzeniem .java) zawiera definicję klasy. Klasa reprezentuje pewien element programu, choć bardzo małe aplikacje mogą się składać tylko z jednej klasy. Zawartość klasy musi być umieszczona wewnątrz pary nawiasów klamrowych. Co się umieszcza w klasie? Wewnątrz klasy umieszcza się jedną lub kilka metod. W klasie Pies metoda szczekaj mogłaby zawierać instrukcje określające, w jaki sposób pies ma szczekać. Wszystkie metody muszą być deklarowane wewnątrz klasy (innymi słowy, wewnątrz nawiasów klamrowych wyznaczających klasę). Co się umieszcza w metodzie? Wewnątrz nawiasów klamrowych metody należy umieszczać instrukcje określające sposób działania metody. Kod metody to po prostu zbiór instrukcji i, jak na razie, możesz wyobrażać sobie, że metoda to coś podobnego do funkcji lub procedury. klasa metoda instrukcje jesteś tutaj(cid:23) 31 rozdz_01_v4.qxd 2004-11-01 23:48 Page 32 Klasa Javy? Anatomia klasy Gdy JVM zaczyna działać, szuka pliku podanego w wierszu poleceń. Następnie poszukuje specjalnej metody, która wygląda dokładnie jak ta pokazana poniżej: public static void main (String[] args) { // tu umieszcza się kod metody } Następnie JVM wykonuje wszystkie instrukcje zapisane pomiędzy nawiasami klamrowymi {} metody main(). Każda aplikacja Javy musi zawierać przynajmniej jedną klasę i przynajmniej jedną metodę main (zwróć uwagę, że nie chodzi o przynajmniej jedną metodę main na klasę, lecz na całą aplikację). „ p u b l i c ” o z n a c z a k l a s ę p u b l i c z n ą , c z y l i t a k ą , d o k t ó r e j k a ż d y b ę d z i e m i e ć d o s t ę p to jest klasa a to jest nazwa klasy otwierający nawias klamrowy klasy argumenty przekazywane do metody; do tej metody należy przekazać tablicę łańcuchów znaków (danych typu String), a tablica ta będzie nosić nazwę „args” otwierający nawiasklamrowy metody każda instrukcja MUSI kończyć się średnikiem!!! (tym zajmiemy się później) typ wyniku zwracanego przez metodę; void oznacza, że metoda nie zwraca żadnej wartości nazwa tej metody to wywołanie nakazuje wyświetlenie danych na standardowym wyjściu (domyślnie pojawią się one w wierszu poleceń systemu) łańcuch znaków, który chcemy wyświetlić zamykający nawias klamrowy metody main zamykający nawias klamrowy klasy MojaPierwszaAplikacja 32 Rozdział 1 rozdz_01_v4.qxd 2004-11-01 23:48 Page 33 Szybki skok na głęboką wodę Tworzenie klasy z metodą main W Javie wszystko jest zapisywane w klasach. W pierwszej kolejności należy stworzyć plik źródłowy (z rozszerzeniem .java), a następnie skompilować go do postaci nowego pliku klasowego (z rozszerzeniem .class). Uruchamiając program, tak naprawdę uruchamiamy klasę. Uruchomienie programu oznacza wydanie wirtualnej maszynie Javy (JVM) polecenia: „Załaduj klasę Witamy, a następnie zacznij wykonywać metodę main(). Program ma działać aż do momentu wykonania całego kodu metody main()”. W rozdziale 2. dokładniej zajmiemy się wszystkimi zagadnieniami związanymi z klasami, jednak jak na razie wystarczy, abyś wiedział, jak napisać kod Javy, który będzie można poprawnie wykonać. A to zagadnienie rozpoczyna się od utworzenia metody main(). Działanie programu zaczyna się właśnie w metodzie main(). Niezależnie od tego, jak duży jest program (innymi słowy, z ilu klas się składa), żeby zacząć całą zabawę, konieczna jest metoda main(). ❶ Zapisz MojaPierwszaAplikacja.java ❷ Skompiluj javac MojaPierwszaAplikacja.java ❸ Wykonaj jesteś tutaj(cid:23) 33 MojaPierwszaAplikacja.java r pila t o m o k MojaPierwszaAplikacja.class rozdz_01_v4.qxd 2004-11-01 23:48 Page 34 Instrukcje, pętle, rozgałęzienia Co można umieszczać w głównej metodzie programu? pętle Prawdziwa zabawa zaczyna się podczas tworzenia zawartości głównej metody programu — main() (jak również wszelkich innych metod). Można w niej umieścić wszelkie konstrukcje stosowane w większości innych języków programowania i które mają sprawić, aby komputer coś zrobił. Kod może nakazać, aby wirtualna maszyna Javy: ❶ Wykonała coś Instrukcje: deklaracje, przypisania, wywołania metod i tak dalej. e j c k u r t s i n rozgałęzienia int x = 3; String imie = Azorek ; x = x + 17; System.out.print( x = + x); double d = Math.random(); // a to jest komentarz ❷ Wykonała coś wielokrotnie Pętle: for oraz while while (x 12) { x = x - 1; } for (; x 10; x = x + 1) { System.out.print( aktualnie x = + x); } ❸ Wykonała coś pod pewnym warunkiem Rozgałęzienia: testy if oraz else if (x == 10) { System.out.print( x musi mieć wartość 10 ); } else { System.out.print( x jest różne od 10 ); } if ((x 3) (imie.equals( Azorek ))) { System.out.print( Nie rusz! Do nogi! ); } System.out.print( Ten wiersz jest wykonywany niezależnie od wszystkiego! ); 34 Rozdział 1 SSkkłłaaddnniiaa nnaa wweessoołłoo ★ Każda instrukcja musi się kończyć średnikiem. x = x + 1; ★ Komentarze jednowierszowe zaczynają się do dwóch znaków ukośnika. // ten wiersz mi przeszkadza ★ W większości przypadków odstępy nie mają znaczenia. x = 3 ; ★ Zmienne deklaruje się, podając nazwę oraz typ (wszelkie typy danych dostępne w Javie zostaną przedstawione w rozdziale 4.). int waga; // typ: int (liczba całkowita), // nazwa: waga ★ Definicje klas i metod należy umieszczać wewnątrz nawiasów klamrowych. public void idzie() { // tu znajdzie się zadziwiający kod } rozdz_01_v4.qxd 2004-11-01 23:48 Page 35 Szybki skok na głęboką wodę while (wiecejPilek == true) { zaglujDalej (); } Pętle i pętle i… Java udostępnia trzy podstawowe typy pętli: while, do – while oraz for. Pętle zostaną opisane dokładniej w dalszej części książki, ale jeszcze nie teraz, dlatego też na razie przedstawimy pętlę while. Jej składnia (nie wspominając w ogóle o logice działania) jest tak prosta, że na pewno już usnąłeś z nudów. Wszystko, co jest umieszczone wewnątrz bloku pętli, jest wykonywane dopóty, dopóki pewien warunek logiczny jest spełniony. Blok pętli jest wyznaczany przez parę nawiasów klamrowych, a zatem wewnątrz nich powinien znaleźć się cały kod, który ma być powtarzany. Kluczowe znaczenie dla działania pętli ma test warunku. W Javie testem takim jest wyrażenie, które zwraca wartość logiczną — innymi słowy coś, co może przyjąć wartość true (prawda) lub false (fałsz). Jeśli napiszemy coś w stylu: „Dopóki (ang. while) wKubeczkuSąLody jest prawdą, jedz dalej”, uzyskujemy typowy test logiczny. Istnieją tylko dwie możliwości: w kubeczku są lody lub ich nie ma. Ale jeśli napisalibyśmy: „Dopóki Janek kontynuuje konsumpcję”, nie uzyskalibyśmy prawdziwego testu. W takim przypadku należałoby zmienić warunek na coś w stylu: „Dopóki Janek jest głodny…” lub „dopóki Janek nie jest najedzony…”. Proste testy logiczne Prosty test logiczny można przeprowadzić, sprawdzając wartość zmiennej przy wykorzystaniu operatora porównania, takiego jak: (mniejszy niż), (większy niż), == (równy; tak, tak, to są dwa znaki równości). Należy zwrócić uwagę na różnice pomiędzy operatorem przypisania (którym jest pojedynczy znak równości) oraz operatorem równości (zapisywanym jako dwa znaki równości). Wielu programistów niechcąco wpisuje = tam, gdzie w rzeczywistości chcieli umieścić ==. (Na pewno nie dotyczy to Ciebie). int x = 4; // przypisujemy zmiennej x wartość 4 while (x 3) { // kod pętli zostanie wykonany, gdyż // x jest większe od 3 x = x + 1; // pętla będzie wykonywana w nieskończoność } int z = 27; while (z == 17) { // kod pętli nie zostanie wykonany, gdyż // z nie jest równe 17 } jesteś tutaj(cid:23) 35 rozdz_01_v4.qxd 2004-11-01 23:48 Page 36 Podstawy Javy Nie ma niemądrych pytań P: umieszczane wewnątrz klasy? Dlaczego wszystko musi być O: Java jest językiem zorientowanym obiektowo. Nie przypomina w niczym kompilatorów z dawnych lat, kiedy to pisało się pojedyncze, monolityczne pliki źródłowe zawierające zbiór procedur. W rozdziale 2. dowiesz się, że klasa jest wzorem, na podstawie którego tworzone są obiekty, oraz że w Javie prawie wszystko to obiekty. P: we wszystkich tworzonych klasach? Czy metodę main() należy umieszczać Nie. Programy pisane w Javie mogą się składać O: z dziesiątek (a nawet setek) klas, lecz może w nich istnieć tylko jedna metoda main() — ta jedyna, służąca do uruchamiania programu. Niemniej jednak można tworzyć klasy testowe, które posiadają metodę main() i służą do testowania innych klas. W języku, którego używałem P: wcześniej, mogłem tworzyć testy logiczne, wykorzystując przy tym zmienne całkowite. Czy w Javie można napisać coś takiego: int x = 1; while (x) { } O: Nie. W Javie liczby całkowite oraz wartości logiczne nie są typami danych zgodnymi ze sobą. Ponieważ wynik testu logicznego musi być wartością logiczną, zatem jedynymi zmiennymi, jakie można sprawdzać bezpośrednio (czyli bez wykorzystania operatora porównania), są zmienne logiczne. Na przykład, można napisać: boolean czyGorace = true; while (czyGorace) { } 36 Rozdział 1 Przykłady pętli while public class Petelki { public static void main(String[] args) { int x = 1; System.out.println( Przed wykonaniem pętli ); while (x 4) { System.out.println( Wewnątrz pętli ); System.out.println( Wartość x = + x); x = x + 1; } System.out.println( I już po pętli... ); A oto wyniki } } java Petelki Przed wykonaniem pętli Wewnątrz pętli Wartość x = 1 Wewnątrz pętli Wartość x = 2 Wewnątrz pętli Wartość x = 3 I już po pętli... KLUCZOWE ZAGADNIENIA ■ ■ ■ Instrukcje muszą kończyć się średnikiem ;. Bloki kodu są wyznaczane przez pary nawiasów klamrowych {}. Zmienną całkowitą należy definiować, podając jej typ i nazwę, na przykład: int x;. ■ Operatorem przypisania jest pojedynczy znak równości =. ■ Operatorem równości są dwa znaki równości ==. ■ ■ ■ Pętla while wykonuje wszystkie instrukcje umieszczone wewnątrz jej bloku (wyznaczonego przez nawiasy klamrowe) tak długo, jak długo podany warunek ma wartość true. Jeśli warunek przyjmie wartość false, to kod umieszczony wewnątrz pętli nie zostanie wykonany, a realizacja programu będzie kontynuowana od wiersza znajdującego się bezpośrednio za blokiem pętli. Testy logiczne należy umieszczać w nawiasach: while (x == 4) { } rozdz_01_v4.qxd 2004-11-01 23:48 Page 37 Rozgałęzienia warunkowe W Javie test if to praktycznie to samo co test warunku używany w pętli while, z tą różnicą, iż zamiast stwierdzenia „dopóki ciągle mamy browar…” stwierdzamy: „ jeśli ciągle mamy browar…”. class TestIf { public static void main(String[] args) { int x = 3; if (x == 3) { System.out.println( x musi mieć wartość 3 ); } System.out.println( Ta instrukcja zawsze zostanie wykonana ); } } Wyniki wykonania programu java TestIf x musi mieć wartość 3 Ta instrukcja zawsze zostanie wykonana W powyższym programie wiersz wyświetlający łańcuch znaków „x musi mieć wartość 3” jest wykonywany wyłącznie w przypadku, gdy warunek (x jest równe 3) będzie spełniony. Z kolei instrukcja wyświetlająca tekst „Ta instrukcja zawsze zostanie wykonana” jest wykonywana zupełnie niezależnie od wyniku wcześniejszego warunku. A zatem w zależności od wartości zmiennej x może zostać wykonana jedna lub dwie instrukcje wyświetlające komunikaty na ekranie. Można jednak dodać do warunku klauzulę else i dzięki temu powiedzieć coś w stylu: „Jeśli wciąż jest browar, to koduj dalej, natomiast w przeciwnym razie kup browar i koduj dalej…”. Szybki skok na głęboką wodę System.out.print kontra System.out.println Jeśli byłeś uważny (w co nie wątpimy), na pewno zauważyłeś, że czasami w programach przykładowych używana była metoda print, a czasami println. Czym one się od siebie różnią? Metoda System.out.println dodaje na końcu wyświetlanego łańcucha znak nowego wiersza (nazwę tej metody można potraktować jako printnewline, czyli — wydrukuj z nowym wierszem), natomiast kolejne wywołania metody System.out.print będą wyświetlać łańcuchy znaków w tym samym wierszu. Jeśli zatem wszystkie wyświetlane łańcuchy znaków mają się znaleźć w osobnych wierszach, to należy wykorzystać metodę println. Jeśli natomiast łańcuchy mają być wyświetlane razem, należy się posłużyć metodą print. Zaostrz ołówek Na podstawie poniższych wyników wyświetlonych na ekranie: java Test DooBeeDooBeeDo uzupełnij brakujące fragmenty kodu: class TestIf2 { public static void main(String[] args) { int x = 2; if (x == 3) { System.out.println( x musi mieć wartość 3 ); } else { System.out.println( x jest RÓŻNE od 3! ); } System.out.println( Ta instrukcja zawsze zostanie wykonana ); } } w y k o n a n i a n o w e g o p r o g r a m u W y n i k i java TestIf2 x jest RÓŻNE od 3! Ta instrukcja zawsze zostanie wykonana class DooBee { public static void main(String[] args) { int x = 1; while (x _____) { System.out.println( Doo ); System.out.println( Bee ); x = x + 1; } if (x = =_____) { System.out.println( Do ); } } } jesteś tutaj(cid:23) 37 rozdz_01_v4.qxd 2004-11-01 23:48 Page 38 Poważna aplikacja w Javie Tworzenie poważnej aplikacji biznesowej Wykorzystajmy całą zdobytą wiedzę o Javie w słusznym celu i stwórzmy coś praktycznego. Potrzebujemy klasy posiadającej metodę main(), zmiennych typu int oraz String, pętli while oraz testu if. Jeszcze trochę pracy, a będziesz błyskawicznie tworzyć aplikacje biznesowe działające na serwerach. Jednak zanim spojrzysz na kod zamieszczony na tej stronie, zastanów się przez chwilę, w jaki sposób samemu napisałbyś klasyczną, ulubioną piosenkę dziecięcą o 99 butelkach piwa. class PiosenkaOPiwie { public static void main(String[] args) { int iloscButelek = 99; String slowo = bottles ; while (iloscButelek 0) { if (iloscButelek == 1) { slowo = bottle ; } System.out.println(iloscButelek + + slowo + of beer on the wall ); System.out.println(iloscButelek + + slowo + of beer. ); System.out.println( Takie one down. ); System.out.println( Pass it around. ); iloscButelek = iloscButelek - 1; if (iloscButelek 0) { System.out.println(iloscButelek + + slowo + of beer on the wall ); } else { System.out.println( No more bottles of beer on the wall ); } // koniec else } // koniec while } // koniec metody main } // koniec klasy Przedstawiony program wciąż zawiera pewne błędy. Można go poprawnie skompilować i uruchomić, jednak wyniki, jakie generuje, nie są w 100 procentach prawidłowe. Sprawdź, czy potrafisz wykryć błąd i poprawić go. 38 Rozdział 1 rozdz_01_v4.qxd 2004-11-01 23:48 Page 39 Szybki skok na głęboką wodę W poniedziałek rano u Roberta W poniedziałek rano budzik Roberta dzwoni o 8:30, podobnie jak we wszystkie pozostałe dni tygodnia. Ale Robert ma za sobą szalony weekend i dlatego nacisnął przycisk DRZEMKA — właśnie w tym momencie wszystko się zaczęło i urządzenia obsługiwane przez Javę rozpoczęły działanie. Najpierw budzik przesyła informację do ekspresu do kawy*: „Hej, mistrzunio ciągle śpi, więc przesuń parzenie kawy o 12 minut”. Ekspres do kawy wysyła wiadomość do tostera Motorola™: „Wstrzymać produkcję tostów, Robert wciąż śpi!”. Następnie budzik przesyła do telefonu komórkowego Roberta — Nokia Navigator™ — komunikat następującej treści: „Zadzwoń do Roberta o 9 rano i powiedz mu, że jesteśmy już troszkę spóźnieni”. I, w końcu, budzik przesyła do bezprzewodowej obroży Burka (Burek to pies Roberta), aż nazbyt dobrze znany komunikat: „Lepiej przynieś gazetę — na spacer nie ma co liczyć”. Toster z Javą Pięć minut później alarm w budziku włącza się ponownie, i także tym razem Robert naciska przycisk DRZEMKA, a urządzenia ponownie zaczynają swoje pogawędki. W końcu alarm włącza się po raz trzeci. Lecz teraz, gdy tylko Robert wyciąga rękę do wiadomego przycisku, budzik przesyła do obroży Burka komunikat „skacz i szczekaj”. Obudzony i przerażony Robert od razu wstaje, dziękując w duchu swej znajomości Javy i niewielkiej wyprawie do sklepu Radio Bajer™, która w tak znaczący sposób usprawniła jego codzienne życie. Tost Roberta jest upieczony. Jego kawa paruje w filiżance. A gazeta leży na miejscu. tu posmarowano masłem Ot, kolejny poranek w domu obsługiwanym przez Javę. Także Ty możesz mieszkać w takim domu. Korzystaj z rozwiązań bazujących na języku Java, Ethernecie i technologii Jini. Bądź świadom ograniczeń innych platform określanych jako „podłącz i pracuj” (co w rzeczywistości oznacza: podłącz i pracuj kolejne 3 dni nad tym, aby to wszystko uruchomić) lub „przenośne”. Ela, siostra Roberta, wypróbowała jedną z tych innych technologii i wyniki nie były, jakby to rzec, ani przekonujące, ani bezpieczne. Lepiej w ogóle nie wspominać, co zrobił jej pies… Czy ta opowieść mogłaby być prawdziwa? I tak, i nie. Choć istnieją wersje Javy działające w różnego typu urządzeniach, takich jak komputery przenośne PDA, telefony komórkowe, pagery, karty inteligentne i tak dalej, to jednak trudno by było znaleźć obrożę lub toster obsługiwany przez Javę. Jednak jeśli nawet nie udałoby Ci się znaleźć wersji ulubionego gadżetu obsługiwanej przez Javę, to i tak będziesz w stanie kontrolować go tak, jak gdyby był wyposażony w ten język, wystarczy w tym celu użyć innego interfejsu (na przykład laptopa), w którym można korzystać z Javy. Takie rozwiązanie nosi nazwę architektury zastępczej Jini. Tak, faktycznie można mieć taki niesamowity dom. * Jeśli jesteś ciekaw protokołu, to jest do tego celu wykorzystywane rozsyłanie grupowe IP. jesteś tutaj(cid:23) 39 Java w budziku Także tu jest Java a a k v r a y B u t J s r ż o e j e W o a t k b ż JAKW TELEWIZJI rozdz_01_v4.qxd 2004-11-01 23:49 Page 40 Napiszmy program Wypróbuj mój nowy program „krasomówczy”, a będziesz mówić równie pięknie i mądrze jak szef lub goście z działu marketingu. public class Krasomowca { public static void main (String[] args) { ❶ // trzy grupy słów, które będą wybierane do zdania (dodaj własne!) String[] listaSlow1 = { architektura wielowarstwowa , 30000 metrów , rozwiązanie B-do-B , aplikacja kliencka , interfejs internetowy , inteligentna karta , rozwiązanie dynamiczne , sześć sigma , przenikliwość }; W porządku, trzeba przyznać, że program piosenki o piwie nie był tak naprawdę poważną aplikacją biznesową. To był jedynie mały żart. Wciąż jednak musisz pokazać swojemu szefowi coś naprawdę poważnego? Przyjrzyj się zatem przedstawionemu kodowi programu krasomówczego. To cacko może Ci zapewnić dostęp do kluczy do łazienki kierowniczej. Notatka: Wpisując kod programu w edytorze, pozwól, aby to sam tekst decydował, gdzie mają być dzielone wiersze i słowa! Nigdy nie naciskaj klawisza Enter, wpisując długi łańcuch znaków (czyli ciąg znaków zapisany pomiędzy znakami cudzysłowu), gdyż taki program się nie skompiluje. A zatem łączniki widoczne w przedstawionym kodzie są prawdziwe i można je umieścić w tekście, po ich wpisaniu nie należy jednak naciskać klawisza Enter. Można to zrobić dopiero po zamknięciu wpisywanego łańcucha znaków. String[] listaSlow2 = { zwiększa możliwości , poprawia atrakcyjność , pomnaża wartość , opracowana dla , bazująca na , rozproszona , sieciowa , skoncentrowana na , podniesiona na wyższy poziom , skierowanej , udostępniona }; String[] listaSlow3 = { procesu , punktu wpisywania , rozwiązania , strategii , paradygmatu , portalu , witryny , wersji , misji }; ❷ // określenie, ile jest słów w każdej z list int lista1Dlugosc = listaSlow1.length; int lista2Dlugosc = listaSlow2.length; int lista3Dlugosc = listaSlow3.length; ❸ // generacja trzech losowych słów (lub zwrotów) int rnd1 = (int) (Math.random() * lista1Dlugosc); int rnd2 = (int) (Math.random() * lista2Dlugosc); int rnd3 = (int) (Math.random() * lista3Dlugosc); ❹ // stworzenie zdania String zdanie = listaSlow1[rnd1] + + listaSlow2[rnd2] + + listaSlow3[rnd3]; ❺ // wyświetlenie zdania System.out.println( To jest to, czego nam trzeba: + zdanie); Tak naprawdę to nie wiemy, czym jest łazienka kierownicza. Jeśli Ty wiesz, prześlij nam proszę zdjęcie pocztą elektroniczną. } } 40 Rozdział 1 rozdz_01_v4.qxd 2004-11-01 23:49 Page 41 Szybki skok na głęboką wodę Program krasomówczy Jak to działa? Najogólniej rzecz biorąc, program tworzy trzy listy słów (zwrotów), następnie losowo wybiera po jednym elemencie z każdej z nich i wyświetla wyniki. Nie przejmuj się, jeśli nie rozumiesz dokładnie, jak działa każda z instrukcji programu. W końcu masz przed sobą całą książkę, zatem wyluzuj się. To tylko rozwiązanie B-do-B pomnaża wartość paradygmatu. 1. Pierwszym krokiem jest utworzenie trzech tablic łańcuchów znaków — będą one zawierać wszystkie słowa i zwroty. Deklarowanie i tworzenie tablic jest bardzo łatwe, oto prosta tablica: String[] zwierzaki = { Burek , Azorek , As }; Wszystkie słowa są zapisane w cudzysłowach (dotyczy to wszystkich grzecznych łańcuchów znaków) i oddzielone od siebie przecinkami. 2. Naszym celem jest losowe wybranie z każdej z list (tablic) jednego słowa, a zatem musimy wiedzieć, jakie są ich długości. Jeśli na liście jest 14 słów, to potrzebna nam będzie liczba losowa z zakresu od 0 do 13 (w Javie pierwszy element tablicy ma indeks 0, a zatem pierwsze słowo znajduje się w komórce tablicy o numerze 0, drugie — w komórce o numerze 1, a ostatnie, czternaste słowo, w komórce o numerze 13). Na szczęście tablice w Javie całkiem chętnie informują nas o swojej długości, co jest bardzo wygodne. Kontynuując przykład tablicy z imionami ulubieńców, można zapytać: int x = zwierzaki.length; a w zmiennej x zostanie zapisana wartość 3. 3. Teraz potrzeba nam trzech liczb losowych. Java ma w standardzie na wyposażeniu wbudowaną profesjonalną i kompetentną grupę metod matematycznych (jak na razie możesz je sobie wyobrażać jako zwyczajne funkcje). Metoda random() zwraca wartość z zakresu od 0 do „prawie” 1, a zatem musimy pomnożyć tę wartość przez ilość elementów używanej listy (czyli przez długość tablicy). Musimy też wymusić, aby uzyskany wynik był liczbą całkowitą (miejsca po przecinku nie są dozwolone!) i dlatego używamy rzutowania typów (szczegółowe informacje na ten temat zostaną podane w rozdziale 4.). Niczym się to nie różni od sytuacji, w której trzeba skonwertować liczbę zmiennoprzecinkową na całkowitą: int x = (int) 24.5; 4. Teraz musimy skonstruować zdanie, wybierając po jednym elemencie z każdej z trzech list i łącząc je w jedną całość (jednocześnie umieszczamy pomiędzy nimi znaki odstępu). Należy w tym celu użyć operatora +, który łączy (osobiście wolimy bardziej techniczne określenie „przeprowadza konkatenację”) obiekty String. Aby pobrać element z tablicy, należy podać jego numer jako indeks (czyli pozycję): String s = zwierzaki[0]; // s ma wartość Burek s = s + + to pies ; // s ma wartość Burek to pies 5. W końcu wyświetlamy utworzony łańcuch znaków w strumieniu wyjściowym. I… voila! W ten sposób przechodzimy do działu marketingu. Oto co my tutaj mamy: architektura wielowarstwowa pomnaża wartość misji przenikliwość skierowanej strategii karta inteligentna podniesiona na wyższy poziom paradygmatu rozwiązanie B−do−B poprawia atrakcyjność portalu aplikacja kliencka opracowana dla rozwiązania sześć sigma skierowana na punkt wpisywania jesteś tutaj(cid:23) 41 rozdz_01_v4.qxd 2004-11-01 23:49 Page 42 Kompilator i wirtualna maszyna Javy (JVM) Pogawędki przy kominku Tematem dzisiejszej pogawędki jest spór pomiędzy kompilatorem a wirtualną maszyną Javy na temat zagadnienia: „Które z tych narzędzi jest ważniejsze?”. WWiirrttuuaallnnaa mmaasszzyynnaa JJaavvyy Co? Chyba sobie żartujesz! Halo! To ja jestem Javą. To dzięki mnie można wykonywać programy. Kompilator jedynie tworzy plik. I to wszystko. Nic więcej — tylko plik. Możesz go sobie wydrukować, użyć jako tapety, wyłożyć nim klatkę dla ptaków lub zrobić z nim cokolwiek innego — plik będzie bezużyteczny, dopóki nie poprosi się mnie o jego wykonanie. No i właśnie… kolejna sprawa… kompilator nie ma za grosz poczucia humoru. Jeszcze raz powtórzę, że jeśli miałbyś cały dzień poświęcić na sprawdzanie tych malutkich i głupich błędów składniowych… KKoommppiillaattoorr Nie podoba mi się ten ton. Wypraszam sobie, ale gdyby nie ja, to w zasadzie co byś była w stanie wykonywać? Dla twojej informacji — jest pewien powód, dla którego Java została zaprojektowana tak, aby wykonywała kod bajtowy. Gdyby Java została zaprojektowana jako język całkowicie interpretowany, w którym wirtualna maszyna musi w czasie rzeczywistym interpretować kod źródłowy prosto z edytora tekstów, to programy Javy działałyby w tempie kulawego lodowca. Na szczęście Java miała wystarczająco dużo czasu, aby przekonać programistów, że w końcu jest wystarczająco szybka i potężna, aby można ją było stosować do realizacji większości zadań. Wybacz, ale wychodzi tu twoja ignorancja (nie żebym mówił, że jesteś arogancka). Choć to prawda — teoretycznie rzecz biorąc — że mogłabyś wykonywać wszystkie poprawnie sformatowane kody bajtowe, nawet gdyby nie zostały utworzone przez kompilator, to w praktyce jest to założenie absurdalne. Ręczne pisanie kodów bajtowych to jak gdyby edycja tekstu poprzez przesuwanie poszczególnych pikseli na ekranie monitora. I byłbym wdzięczny, gdybyś nie zwracała się do mnie w ten sposób. No przecież nie mówię, że jesteś całkowicie bezużyteczny. Ale czym ty się w zasadzie zajmujesz? Tak naprawdę… Bo w zasadzie to nie wiem. Programiści mogliby w gruncie rzeczy sami pisać kod bajtowy, a ja mogłabym je wykonywać. I szybciutko straciłbyś pracę, bratku. Pominę humorystyczne aspekty twojej wypowiedzi, ale wciąż nie odpowiedziałeś na moje pytanie. Co ty w zasadzie robisz? 42 Rozdział 1 rozdz_01_v4.qxd 2004-11-01 23:49 Page 43 WWiirrttuuaallnnaa mmaasszzyynnaa JJaavvyy Ale niektóre wciąż do mnie docierają! Mogę zgłosić wyjątek ClassCastException, a czasami programiści próbują zapisywać dane w tablicach, które zostały zadeklarowane do przechowywania czegoś innego, i… OK. Pewnie. Ale co z bezpieczeństwem? Spójrz na te wszystkie metody zabezpieczeń, które ja wykonuję… A ty co? Sprawdzasz, czy ktoś nie zapomniał wpisać średnika? Och, to naprawdę poważne zagrożenie bezpieczeństwa! Dzięki ci za to o kompilatorze! Nieważne. Ja też muszę wykonywać tę samą pracę tylko po to, aby przed wykonaniem programu upewnić się, czy ktoś nie zmieniał kodów bajtowych, które ty wcześniej skompilowałeś. Och, możesz na to liczyć. Bratku. Szybki skok na głęboką wodę KKoommppiillaattoorr Pamiętasz zapewne, że Java jest językiem o ścisłej kontroli typów, co oznacza, że nie mogę pozwolić, aby zmienne zawierały dane niewłaściwych typów. To kluczowe zagadnienie bezpieczeństwa i to ja jestem w stanie zapobiec pojawianiu się znacznej większości nieprawidłowości, zanim w ogóle będą mogły przeszkodzić ci w działaniu. Poza tym… Przepraszam, ale jeszcze nie skończyłem. Owszem, istnieją pewne wyjątki związane z typami, które mogą się pojawiać w czasie działania programu, ale trzeba na nie pozwolić ze względu na kolejną niezwykle ważną cechę Javy, a mianowicie — dynamiczne wiązanie. W czasie działania programów pisanych w Javie można do nich dołączać nowe obiekty, o których programista tworzący program nawet nie wiedział, dlatego też muszę zezwolić na pewną elastyczność. Jednak moje zadanie polega na wykryciu kodu, który spowoduje — mógłby spowodować — wystąpienie błędów podczas działania programu. Zazwyczaj jestem w stanie określić, kiedy coś nie będzie działać, na przykład kiedy programista użyje wartości logicznej zamiast połączenia sieciowego, wykryję to i zabezpieczę go przed problemami, jakie pojawiłyby się po uruchomieniu programu. Przepraszam bardzo, ale jestem pierwszą linią obrony, jak zwykło się mówić. Naruszenia typów danych, o jakich wcześniej mówiłem, mogłyby doprowadzić do prawdziwego chaosu w programie, gdyby tylko się pojawiły. Dodatkowo wykrywam i zapobiegam naruszeniom praw dostępu, takim jak próba wywołania metody prywatnej lub zmiana metod, które ze względów bezpieczeństwa, nigdy nie powinny być zmieniane. Uniemożliwiam programistom przeprowadzanie modyfikacji kodu, którego nie powinni zmieniać, w tym także kodu, który próbuje uzyskać dostęp do krytycznych informacji innych klas. Opisanie znaczenia mojej pracy mogłoby zająć wiele godzin, a może nawet i dni. Oczywiście, ale jak już wcześniej zauważyłem, gdybym ja nie zapobiegał około 99 procentom potencjalnych problemów, to ty bez wątpienia szybko byś się „zawiesiła”. Poza tym, wygląda na to, że nie masz już czasu, a zatem wrócimy do tego tematu w kolejnej pogawędce. jesteś tutaj(cid:23) 43 rozdz_01_v4.qxd 2004-11-01 23:49 Page 44 Ćwiczenia. Magnesiki z kodem MMaaggnneessiikkii zz kkooddeemm Działający program Javy został podzielony na fragmenty. Czy jesteś w stanie złożyć go z powrotem w jedną całość, tak aby wygenerował przedstawione poniżej wyniki? Niektóre nawiasy klamrowe spadły na podłogę i były zbyt małe, aby można je było podnieść, dlatego w razie potrzeby możesz je dodawać! Ćwiczenia if (x == 1) { System.out.print( d ); x = x - 1; } if (x == 2) { System.out.print( b c ); } class Ukladanka { public static void main(String[] args) { if (x 2) { System.out.print( a ); } int x = 3; x = x - 1; System.out.print( - ); while (x 0) { Wyniki: 44 Rozdział 1 rozdz_01_v4.qxd 2004-11-01 23:49 Page 45 Ćwiczenia BĄDŹ kompilatorem Każdy z plików przedstawionych na tej stronie to niezależny, kompletny plik źródłowy Javy. Twoim zadaniem jest wcielenie się w kompilator i określenie, czy poszczególne pliki można p
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Head First Java. Edycja polska (Rusz głową!)
Autor:
,

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: