You are on page 1of 44

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Java. Kompendium
programisty
Autor: Herbert Schildt
Tumaczenie: Rafa Joca, Mikoaj
Szczepaniak, Jakub Thiele-Wieczorek
ISBN: 83-7361-862-7
Tytu oryginau: Java: The Complete Reference,
J2SE 5 Edition (Complete Reference)
Format: B5, stron: 1112
Popularno jzyka Java stale ronie. Programici z caego wiata wykorzystuj go
do tworzenia zarwno prostych aplikacji, jak i zoonych systemw. Podstawowa zaleta
Javy przenono kodu powoduje, e programy napisane w Javie moemy spotka
nie tylko na dyskach komputerw i serwerw, ale rwnie w telefonach komrkowych
i innych urzdzeniach mobilnych. Java jest cigle rozwijana w kadej kolejnej wersji
pojawiaj si nowe elementy, uatwiajce realizacj coraz bardziej zoonych zagadnie
programistycznych.
Java. Kompendium programisty to doskonay przewodnik po najnowszym wcieleniu
jzyka Java, noszcym oznaczenie J2SE5. Kady twrca aplikacji w Javie znajdzie tu
niezbdne do swojej pracy informacje. Autor Herb Schildt, znany z wielu bestsellerowych pozycji dotyczcych programowania w Javie i C++ opisuje wszystkie
elementy jzyka Java w wersji 5. Typy danych, metody, konstrukcje, podstawowe
biblioteki i techniki programistyczne wszystko zostao opisane prostym i zrozumiaym
jzykiem oraz zilustrowane przykadami.
Historia jzyka Java
Podstawowe zaoenia programowania obiektowego
Typy danych i zmienne
Operatory
Klasy, metody, pakiety i interfejsy
Wtki i wyjtki
Elementy bibliotek Javy
Operacje wejcia i wyjcia
Programowanie sieciowe
Biblioteki AWT i Swing
JavaBeans i serwlety
W tym podrczniku znajdziesz odpowiedzi na wszystkie pytania zwizane z Jav.

Spis treci
O Autorze ....................................................................................... 21
Przedmowa ..................................................................................... 23

Cz I

Jzyk Java .....................................................................27

Rozdzia 1. Historia i ewolucja jzyka Java ........................................................ 29


Rodowd Javy ................................................................................................................ 29
Narodziny nowoczesnego jzyka C ..................................................................... 30
Jzyk C++ nastpny krok .................................................................................... 31
Podwaliny jzyka Java ............................................................................................. 32
Powstanie jzyka Java .................................................................................................... 32
Powizanie z jzykiem C# ....................................................................................... 34
Dlaczego jzyk Java jest tak wany dla internetu ........................................................... 35
Aplety Javy .............................................................................................................. 35
Bezpieczestwo ........................................................................................................ 36
Przenono .............................................................................................................. 36
Magia jzyka Java kod bajtowy ................................................................................. 36
Hasa jzyka Java ........................................................................................................... 37
Prostota .................................................................................................................... 38
Obiektowo ............................................................................................................. 38
Solidno .................................................................................................................. 38
Wielowtkowo ...................................................................................................... 39
Neutralno architektury .......................................................................................... 39
Interpretowalno i wysoka wydajno .................................................................... 40
Rozproszenie ............................................................................................................ 40
Dynamika ................................................................................................................. 40
Ewolucja Javy ................................................................................................................ 40
Rewolucja J2SE 5 ........................................................................................................... 41
Kultura innowacji ........................................................................................................... 42

Rozdzia 2. Podstawy jzyka Java ..................................................................... 43


Programowanie obiektowe ............................................................................................. 43
Dwa paradygmaty .................................................................................................... 43
Abstrakcja ................................................................................................................ 44
Trzy zasady programowania obiektowego ............................................................... 44
Pierwszy przykadowy program ..................................................................................... 49
Wpisanie kodu programu ......................................................................................... 50
Kompilacja programw ............................................................................................ 50
Blisze spojrzenie na pierwszy przykadowy program ............................................. 51

Java. Kompendium programisty


Drugi prosty program ..................................................................................................... 53
Dwie instrukcje sterujce ............................................................................................... 55
Instrukcja if .............................................................................................................. 55
Ptla for .................................................................................................................... 57
Bloki kodu ...................................................................................................................... 58
Kwestie leksykalne ......................................................................................................... 59
Znaki niedrukowane ................................................................................................. 60
Identyfikatory ........................................................................................................... 60
Litera ....................................................................................................................... 60
Komentarze .............................................................................................................. 60
Separatory ................................................................................................................ 61
Sowa kluczowe jzyka Java .................................................................................... 61
Biblioteki klas Javy ........................................................................................................ 62

Rozdzia 3. Typy danych, zmienne i tablice ........................................................ 63


Java to jzyk ze cis kontrol typw ............................................................................ 63
Typy proste ..................................................................................................................... 63
Typy cakowite ............................................................................................................... 64
Typ byte ................................................................................................................... 65
Typ short .................................................................................................................. 65
Typ int ...................................................................................................................... 66
Typ long ................................................................................................................... 66
Typy zmiennoprzecinkowe ............................................................................................ 67
Typ float ................................................................................................................... 67
Typ double ............................................................................................................... 67
Typ znakowy .................................................................................................................. 68
Typ logiczny ................................................................................................................... 69
Blisze spojrzenie na literay .......................................................................................... 70
Literay bdce liczbami cakowitymi ...................................................................... 70
Literay zmiennoprzecinkowe .................................................................................. 71
Literay logiczne ....................................................................................................... 71
Literay znakowe ...................................................................................................... 71
Literay tekstowe ...................................................................................................... 72
Zmienne .......................................................................................................................... 72
Deklaracja zmiennej ................................................................................................. 73
Inicjalizacja dynamiczna .......................................................................................... 73
Zasig i czas ycia zmiennych ................................................................................. 74
Konwersja typw i rzutowanie ....................................................................................... 76
Automatyczna konwersja typw .............................................................................. 76
Rzutowanie dla typw niezgodnych ......................................................................... 77
Automatyczne rozszerzanie typw w wyraeniach ........................................................ 78
Zasady rozszerzania typu ......................................................................................... 79
Tablice ............................................................................................................................ 80
Tablice jednowymiarowe ......................................................................................... 80
Tablice wielowymiarowe ......................................................................................... 83
Alternatywna skadnia deklaracji tablicy ................................................................. 86
Kilka sw na temat cigw znakw .............................................................................. 87
Uwaga dla programistw jzyka C lub C++ na temat wskanikw ................................ 87

Rozdzia 4. Operatory ....................................................................................... 89


Operatory arytmetyczne ................................................................................................. 89
Podstawowe operatory arytmetyczne ....................................................................... 89
Operator reszty z dzielenia ....................................................................................... 91
Operatory arytmetyczne z przypisaniem .................................................................. 91
Inkrementacja i dekrementacja ................................................................................. 92

Spis treci

5
Operatory bitowe ............................................................................................................ 94
Podstawowe operatory bitowe .................................................................................. 95
Przesunicie w lewo ................................................................................................. 97
Przesunicie w prawo ............................................................................................... 99
Przesunicie w prawo bez znaku ............................................................................ 100
Operatory bitowe z przypisaniem ........................................................................... 102
Operatory relacji ........................................................................................................... 103
Operatory logiczne ....................................................................................................... 104
Operatory logiczne ze skracaniem .......................................................................... 105
Operator przypisania .................................................................................................... 106
Operator ?: .................................................................................................................... 106
Kolejno wykonywania operatorw ........................................................................... 107
Wykorzystanie nawiasw okrgych ............................................................................ 107

Rozdzia 5. Struktury sterujce ....................................................................... 109


Instrukcje wyboru ......................................................................................................... 109
Konstrukcja if ......................................................................................................... 109
Konstrukcja switch ................................................................................................. 112
Instrukcje iteracji .......................................................................................................... 116
Ptla while .............................................................................................................. 116
Ptla do-while ........................................................................................................ 118
Ptla for .................................................................................................................. 121
Wersja for-each ptli for ........................................................................................ 124
Ptle zagniedone ................................................................................................. 129
Instrukcje skoku ........................................................................................................... 130
Instrukcja break ...................................................................................................... 130
Instrukcja continue ................................................................................................. 134
Instrukcja return ..................................................................................................... 135

Rozdzia 6. Wprowadzenie do klas .................................................................. 137


Klasy ............................................................................................................................ 137
Oglna posta klasy ............................................................................................... 137
Prosta klasa ............................................................................................................ 139
Tworzenie obiektw ..................................................................................................... 141
Blisze spojrzenie na klas ..................................................................................... 142
Przypisywanie zmiennych referencyjnych do obiektw ............................................... 143
Metody ......................................................................................................................... 144
Dodanie metody do klasy Box ............................................................................... 145
Zwracanie wartoci ................................................................................................ 146
Dodanie metody przyjmujcej parametry ............................................................... 148
Konstruktor .................................................................................................................. 150
Konstruktor sparametryzowany ............................................................................. 152
Sowo kluczowe this ..................................................................................................... 153
Ukrywanie zmiennych skadowych ........................................................................ 153
Mechanizm odzyskiwania pamici ............................................................................... 154
Metoda finalize() .......................................................................................................... 154
Klasa stosu ................................................................................................................... 155

Rozdzia 7. Dokadniejsze omwienie metod i klas ........................................... 159


Przecianie metod ....................................................................................................... 159
Przecianie konstruktorw ................................................................................... 162
Obiekty jako parametry ................................................................................................ 164
Dokadniejsze omwienie przekazywania argumentw ............................................... 166
Zwracanie obiektw ..................................................................................................... 168
Rekurencja .................................................................................................................... 169

Java. Kompendium programisty


Wprowadzenie do sterowania dostpem ....................................................................... 171
Skadowe statyczne ...................................................................................................... 175
Sowo kluczowe final ................................................................................................... 177
Powtrka z tablic .......................................................................................................... 177
Klasy zagniedone i klasy wewntrzne ........................................................................ 179
Omwienie klasy String ............................................................................................... 182
Wykorzystanie argumentw wiersza polece ............................................................... 184
Zmienna liczba argumentw ........................................................................................ 185
Przecianie metod o zmiennej liczbie argumentw .............................................. 188
Zmienna liczba argumentw i niejednoznacznoci ................................................ 189

Rozdzia 8. Dziedziczenie ................................................................................ 191


Proste dziedziczenie ..................................................................................................... 191
Dostp do skadowych a dziedziczenie .................................................................. 193
Bardziej praktyczny przykad ................................................................................. 194
Zmienna klasy bazowej moe zawiera referencj do obiektu podklasy ................ 196
Sowo kluczowe super .................................................................................................. 197
Wykorzystanie sowa kluczowego super
do wywoania konstruktora klasy bazowej .......................................................... 197
Drugie zastosowanie sowa kluczowego super ....................................................... 200
Tworzenie hierarchii wielopoziomowej ....................................................................... 201
Kiedy dochodzi do wywoania konstruktorw? ........................................................... 204
Przesanianie metod ...................................................................................................... 205
Dynamiczne przydzielanie metod ................................................................................ 208
Dlaczego warto przesania metody? ..................................................................... 209
Zastosowanie przesaniania metod ......................................................................... 210
Klasy abstrakcyjne ....................................................................................................... 211
Sowo kluczowe final i dziedziczenie ........................................................................... 214
Sowo kluczowe final zapobiega przesanianiu ...................................................... 214
Sowo kluczowe final zapobiega dziedziczeniu ..................................................... 215
Klasa Object ................................................................................................................. 215

Rozdzia 9. Pakiety i interfejsy ........................................................................ 217


Pakiety .......................................................................................................................... 217
Definiowanie pakietu ............................................................................................. 218
Znajdowanie pakietw i cieka CLASSPATH ..................................................... 219
Prosty przykad pakietu .......................................................................................... 219
Ochrona dostpu ........................................................................................................... 220
Przykad dostpu .................................................................................................... 221
Import pakietw ........................................................................................................... 224
Interfejsy ...................................................................................................................... 226
Definiowanie interfejsu .......................................................................................... 227
Implementacja interfejsu ........................................................................................ 227
Zastosowanie interfejsw ....................................................................................... 230
Zmienne w interfejsach .......................................................................................... 233
Interfejsy mona rozszerza ................................................................................... 235

Rozdzia 10. Obsuga wyjtkw ......................................................................... 237


Podstawy obsugi wyjtkw ......................................................................................... 237
Typy wyjtkw ............................................................................................................. 238
Nieprzechwycone wyjtki ............................................................................................ 238
Wykorzystanie konstrukcji try i catch .......................................................................... 240
Wywietlenie opisu wyjtku .................................................................................. 241
Wiele klauzul catch ...................................................................................................... 241
Zagniedone konstrukcje try ....................................................................................... 243

Spis treci

7
Instrukcja throw ............................................................................................................ 245
Klauzula throws ............................................................................................................ 246
Sowo kluczowe finally ................................................................................................ 248
Wyjtki wbudowane w jzyk Java ............................................................................... 249
Tworzenie wasnej podklasy wyjtkw ........................................................................ 250
acuch wyjtkw ....................................................................................................... 252
Wykorzystanie wyjtkw ............................................................................................. 254

Rozdzia 11. Programowanie wielowtkowe ...................................................... 255


Model wtkw jzyka Java .......................................................................................... 256
Priorytety wtkw .................................................................................................. 257
Synchronizacja ....................................................................................................... 257
Przekazywanie komunikatw ................................................................................. 258
Klasa Thread i interfejs Runnable .......................................................................... 258
Wtek gwny .............................................................................................................. 259
Tworzenie wtku .......................................................................................................... 261
Implementacja interfejsu Runnable ........................................................................ 261
Rozszerzanie klasy Thread ..................................................................................... 263
Wybr odpowiedniego podejcia ........................................................................... 264
Tworzenie wielu wtkw ............................................................................................. 264
Wykorzystanie metod isAlive() oraz join() .................................................................. 266
Priorytety wtkw ........................................................................................................ 268
Synchronizacja ............................................................................................................. 271
Synchronizacja metod ............................................................................................ 271
Konstrukcja synchronized ...................................................................................... 274
Komunikacja midzywtkowa ..................................................................................... 275
Blokada wzajemna ................................................................................................. 279
Zawieszanie, wznawianie i zatrzymywanie wtkw .................................................... 281
Zawieszanie, wznawianie i zatrzymywanie wtkw w Java 1.1 lub starszej ......... 282
Nowoczesny sposb zawieszania, wznawiania i zatrzymywania wtkw ............. 284
Korzystanie z wielowtkowoci ................................................................................... 286

Rozdzia 12. Wyliczenia, automatyczne otaczanie typw prostych i metadane .... 287
Wyliczenia .................................................................................................................... 287
Podstawy wylicze ................................................................................................. 288
Metody values() i valueOf() ................................................................................... 290
Wyliczenia Javy jako typ klasy .............................................................................. 291
Wyliczenia dziedzicz po klasie Enum .................................................................. 293
Inny przykad wyliczenia ....................................................................................... 295
Typy otoczkowe ........................................................................................................... 296
Automatyczne otaczanie typw prostych ..................................................................... 298
Automatyczne otaczanie i metody .......................................................................... 299
Automatyczne otaczanie i rozpakowywanie w wyraeniach .................................. 300
Automatyczne otaczanie dla typw znakowych i logicznych ................................ 302
Automatyczne otaczanie pomaga zapobiega bdom .............................................. 303
Sowo ostrzeenia .................................................................................................. 303
Metadane (notatki) ....................................................................................................... 304
Podstawy tworzenia notatek ................................................................................... 304
Okrelenie strategii zachowania ............................................................................. 305
Pobieranie notatek w trakcie dziaania programu dziki refleksji .......................... 306
Interfejs AnnotatedElement .................................................................................... 310
Wartoci domylne ................................................................................................. 311
Notatki znacznikowe .............................................................................................. 312
Notatki jednoelementowe ....................................................................................... 313
Wbudowane notatki ............................................................................................... 315
Ograniczenia .......................................................................................................... 316

Java. Kompendium programisty

Rozdzia 13. Wejcie-wyjcie, aplety i inne tematy ............................................ 317


Podstawowa obsuga wejcia i wyjcia ........................................................................ 317
Strumienie .............................................................................................................. 318
Strumienie znakowe i bajtowe ............................................................................... 318
Predefiniowane strumienie ..................................................................................... 319
Odczyt danych z konsoli .............................................................................................. 321
Odczyt znakw ....................................................................................................... 321
Odczyt cigw znakw .......................................................................................... 322
Wywietlanie informacji na konsoli ............................................................................. 324
Klasa PrintWriter .......................................................................................................... 324
Odczyt i zapis plikw ................................................................................................... 325
Podstawy apletw ......................................................................................................... 328
Modyfikatory transient i volatile .................................................................................. 331
Operator instanceof ...................................................................................................... 332
Modyfikator strictfp ..................................................................................................... 334
Metody napisane w kodzie rdzennym .......................................................................... 335
Problemy z metodami rdzennymi ........................................................................... 338
Asercja .......................................................................................................................... 338
Opcje wczania i wyczania asercji ..................................................................... 341
Import statyczny ........................................................................................................... 341

Rozdzia 14. Typy sparametryzowane ................................................................ 345


Czym s typy sparametryzowane? ................................................................................ 346
Prosty przykad zastosowania typw sparametryzowanych ......................................... 346
Typy sparametryzowane dziaaj tylko dla obiektw ............................................. 350
Typy sparametryzowane rni si, jeli maj inny argument typu ....................... 350
W jaki sposb typy sparametryzowane zwikszaj bezpieczestwo? .................... 350
Klasa sparametryzowana z dwoma parametrami typu .................................................. 353
Oglna posta klasy sparametryzowanej ...................................................................... 354
Typy ograniczone ......................................................................................................... 354
Zastosowanie argumentw wieloznacznych ................................................................. 357
Ograniczony argument wieloznaczny .................................................................... 359
Tworzenie metody sparametryzowanej ........................................................................ 364
Konstruktory sparametryzowane ............................................................................ 366
Interfejsy sparametryzowane ........................................................................................ 367
Typy surowe i dotychczasowy kod .............................................................................. 369
Hierarchia klas sparametryzowanych ........................................................................... 372
Zastosowanie sparametryzowanej klasy bazowej ................................................... 372
Podklasa sparametryzowana ................................................................................... 374
Porwnywanie typw w trakcie dziaania programu
dla hierarchii klas sparametryzowanych .............................................................. 375
Rzutowanie ............................................................................................................ 378
Przesanianie metod w klasach sparametryzowanych ............................................ 378
Znoszenie ..................................................................................................................... 379
Metody mostu ........................................................................................................ 381
Bdy niejednoznacznoci ............................................................................................ 383
Pewne ograniczenia typw sparametryzowanych ......................................................... 384
Nie mona tworzy egzemplarza parametru typu .................................................. 384
Ograniczenia dla skadowych statycznych ............................................................. 385
Ograniczenia tablic typw sparametryzowanych ................................................... 385
Ograniczenia wyjtkw typw sparametryzowanych ............................................ 386
Ostatnie uwagi na temat typw sparametryzowanych .................................................. 387

Spis treci

Cze II

Biblioteka jzyka Java .................................................389

Rozdzia 15. Cigi znakw ................................................................................ 391


Konstruktory klasy String ............................................................................................. 392
Konstruktory dodane w wydaniu J2SE 5 ............................................................... 394
Dugo cigu znakw .................................................................................................. 394
Specjalne operacje na cigach znakw ......................................................................... 394
Literay tekstowe .................................................................................................... 395
Konkatenacja cigw znakw ................................................................................ 395
Konkatenacja cigu znakw z innymi typami danych ............................................ 396
Konwersja do cigu znakw i metoda toString() ................................................... 396
Wydobycie znakw ...................................................................................................... 397
Metoda charAt() ..................................................................................................... 398
Metoda getChars() .................................................................................................. 398
Metoda getBytes() .................................................................................................. 399
Metoda toCharArray() ............................................................................................ 399
Porwnywanie cigw znakw .................................................................................... 399
Metody equals() i equalsIgnoreCase() .................................................................... 399
Metoda regionMatches() ........................................................................................ 400
Metody startsWith() i endsWith() .......................................................................... 401
Metoda equals() a operator == ............................................................................... 401
Metoda compareTo() .............................................................................................. 402
Wyszukiwanie podcigw znakw ............................................................................... 403
Modyfikacja cigu znakw ........................................................................................... 405
Metoda substring() ................................................................................................. 405
Metoda concat() ..................................................................................................... 406
Metoda replace() .................................................................................................... 406
Metoda trim() ......................................................................................................... 407
Konwersja danych za pomoc metody valueOf() ......................................................... 408
Zmiana wielkoci liter cigu znakw ........................................................................... 408
Dodatkowe metody klasy String ................................................................................... 409
Klasa StringBuffer ........................................................................................................ 409
Konstruktory klasy StringBuffer ............................................................................ 411
Metody length() i capacity() ................................................................................... 411
Metoda ensureCapacity() ....................................................................................... 412
Metoda setLength() ................................................................................................ 412
Metody charAt() i setCharAt() ............................................................................... 412
Metoda getChars() .................................................................................................. 413
Metoda append() .................................................................................................... 413
Metoda insert() ....................................................................................................... 414
Metoda reverse() .................................................................................................... 414
Metody delete() i deleteCharAt() ........................................................................... 415
Metoda replace() .................................................................................................... 416
Metoda substring() ................................................................................................. 416
Dodatkowe metody klasy StringBuffer .................................................................. 416
Klasa StringBuilder ...................................................................................................... 418

Rozdzia 16. Pakiet java.lang ............................................................................ 419


Otoczki typw prostych ................................................................................................ 420
Klasa Number ........................................................................................................ 420
Klasy Double i Float .............................................................................................. 420
Klasy Byte, Short, Integer i Long ........................................................................... 424
Klasa Character ...................................................................................................... 432
Dodatki wprowadzone w celu obsugi rozszerzonych znakw Unicode ................ 434
Klasa Boolean ........................................................................................................ 435

10

Java. Kompendium programisty


Klasa Void .................................................................................................................... 435
Klasa Process ............................................................................................................... 436
Klasa Runtime .............................................................................................................. 437
Zarzdzanie pamici ............................................................................................. 438
Wykonywanie innych programw ......................................................................... 440
Klasa ProcessBuilder .................................................................................................... 441
Klasa System ................................................................................................................ 442
Wykorzystanie metody currentTimeMillis()
do obliczania czasu wykonywania programu ...................................................... 444
Uycie metody arraycopy() .................................................................................... 445
Waciwoci rodowiska ........................................................................................ 446
Klasa Object ................................................................................................................. 446
Wykorzystanie metody clone() i interfejsu Cloneable .................................................. 446
Klasa Class ................................................................................................................... 449
Klasa ClassLoader ........................................................................................................ 452
Klasa Math ................................................................................................................... 452
Funkcje trygonometryczne ..................................................................................... 452
Funkcje wykadnicze .............................................................................................. 453
Funkcje zaokrgle ................................................................................................ 453
Rnorodne metody klasy Math ............................................................................. 454
Klasa StrictMath ........................................................................................................... 455
Klasa Compiler ............................................................................................................. 455
Klasy Thread i ThreadGroup oraz interfejs Runnable .................................................. 455
Interfejs Runnable .................................................................................................. 456
Klasa Thread .......................................................................................................... 456
Klasa ThreadGroup ................................................................................................ 458
Klasy ThreadLocal i InheritableThreadLocal ............................................................... 462
Klasa Package .............................................................................................................. 463
Klasa RuntimePermission ............................................................................................ 463
Klasa Throwable .......................................................................................................... 463
Klasa SecurityManager ................................................................................................ 463
Klasa StackTraceElement ............................................................................................. 464
Klasa Enum .................................................................................................................. 465
Interfejs CharSequence ................................................................................................. 466
Interfejs Comparable .................................................................................................... 467
Interfejs Appendable .................................................................................................... 467
Interfejs Iterable ........................................................................................................... 467
Interfejs Readable ......................................................................................................... 468
Podpakiety pakietu java.lang ........................................................................................ 468
Podpakiet java.lang.annotation .............................................................................. 468
Podpakiet java.lang.instrument .............................................................................. 469
Podpakiet java.lang.management ........................................................................... 469
Podpakiet java.lang.ref ........................................................................................... 469
Podpakiet java.lang.reflect ..................................................................................... 469

Rozdzia 17. Pakiet java.util, cz 1. kolekcje ............................................ 471


Wprowadzenie do kolekcji ........................................................................................... 472
Zmiany w kolekcjach spowodowane wydaniem J2SE 5 .............................................. 473
Typy sparametryzowane w znaczcy sposb zmieniaj kolekcje ........................... 473
Automatyczne otaczanie uatwia korzystanie z typw prostych ............................ 474
Ptla for typu for-each ............................................................................................ 474
Interfejsy kolekcji ......................................................................................................... 474
Interfejs Collection ................................................................................................. 475
Interfejs List ........................................................................................................... 477

Spis treci

11
Interfejs Set ............................................................................................................ 478
Interfejs SortedSet .................................................................................................. 479
Interfejs Queue ....................................................................................................... 479
Klasy kolekcji ............................................................................................................... 480
Klasa ArrayList ...................................................................................................... 481
Klasa LinkedList .................................................................................................... 484
Klasa HashSet ........................................................................................................ 486
Klasa LinkedHashSet ............................................................................................. 488
Klasa TreeSet ......................................................................................................... 488
Klasa PriorityQueue ............................................................................................... 489
Klasa EnumSet ....................................................................................................... 490
Dostp do kolekcji za pomoc iteratora ........................................................................ 490
Korzystanie z iteratora Iterator ............................................................................... 492
Ptla typu for-each jako alternatywa dla iteratora .................................................. 494
Przechowywanie w kolekcjach wasnych klas .............................................................. 495
Interfejs RandomAccess ............................................................................................... 496
Korzystanie z map ........................................................................................................ 496
Interfejsy map ........................................................................................................ 497
Klasy map .............................................................................................................. 499
Komparatory ................................................................................................................. 505
Wykorzystanie komparatora ................................................................................... 505
Algorytmy kolekcji ....................................................................................................... 508
Klasa Arrays ................................................................................................................. 513
Dlaczego kolekcje s sparametryzowane? .................................................................... 516
Starsze klasy i interfejsy ............................................................................................... 519
Interfejs wylicze ................................................................................................... 520
Klasa Vector ........................................................................................................... 520
Klasa Stack ............................................................................................................. 524
Klasa Dictionary ..................................................................................................... 526
Klasa Hashtable ...................................................................................................... 527
Klasa Properties ..................................................................................................... 530
Wykorzystanie metod store() i load() ..................................................................... 533
Ostatnie uwagi na temat kolekcji .................................................................................. 535

Rozdzia 18. Pakiet java.util, cz 2. pozostae klasy uytkowe ................... 537


Klasa StringTokenizer .................................................................................................. 537
Klasa BitSet .................................................................................................................. 539
Klasa Date .................................................................................................................... 542
Klasa Calendar ............................................................................................................. 543
Klasa GregorianCalendar ............................................................................................. 546
Klasa TimeZone ........................................................................................................... 548
Klasa SimpleTimeZone ................................................................................................ 548
Klasa Locale ................................................................................................................. 550
Klasa Random .............................................................................................................. 551
Klasa Observable .......................................................................................................... 553
Interfejs Observer ................................................................................................... 554
Przykad uycia interfejsu Observer ....................................................................... 555
Klasy Timer i TimerTask ............................................................................................. 557
Klasa Currency ............................................................................................................. 560
Klasa Formatter ............................................................................................................ 561
Konstruktory klasy Formatter ................................................................................ 561
Metody klasy Formatter ......................................................................................... 562
Podstawy formatowania ......................................................................................... 562
Formatowanie tekstw i znakw ............................................................................ 565

12

Java. Kompendium programisty


Formatowanie liczb ................................................................................................ 565
Formatowanie daty i godziny ................................................................................. 567
Specyfikatory %n i %% ......................................................................................... 567
Okrelanie minimalnej szerokoci pola .................................................................. 569
Okrelanie precyzji ................................................................................................. 570
Uywanie znacznikw formatw ........................................................................... 571
Wyrwnywanie danych wyjciowych .................................................................... 572
Znaczniki spacji, plusa, zera i nawiasw ................................................................ 573
Znacznik przecinka ................................................................................................ 574
Znacznik # .............................................................................................................. 574
Opcja wielkich liter ................................................................................................ 574
Stosowanie indeksu argumentu .............................................................................. 575
Metoda printf() w Javie .......................................................................................... 576
Klasa Scanner ............................................................................................................... 577
Konstruktory klasy Scanner ................................................................................... 577
Podstawy skanowania ............................................................................................ 578
Kilka przykadw uycia klasy Scanner ................................................................. 580
Ustawianie separatorw ......................................................................................... 585
Pozostae elementy klasy Scanner .......................................................................... 586
Podpakiety pakietu java.util ......................................................................................... 587
java.util.concurrent, java.util.concurrent.atomic oraz java.util.concurrent.locks ... 588
java.util.jar ............................................................................................................. 588
java.util.logging ..................................................................................................... 588
java.util.prefs .......................................................................................................... 588
java.util.regex ......................................................................................................... 588
java.util.zip ............................................................................................................. 588

Rozdzia 19. Operacje wejcia-wyjcia: analiza pakietu java.io ........................... 589


Dostpne w Javie klasy i interfejsy obsugujce operacje wejcia-wyjcia .................. 590
Klasa File ..................................................................................................................... 590
Katalogi .................................................................................................................. 593
Stosowanie interfejsu FilenameFilter ..................................................................... 594
Alternatywna metoda listFiles() ............................................................................. 595
Tworzenie katalogw ............................................................................................. 596
Interfejsy Closeable i Flushable ................................................................................... 596
Klasy strumienia ........................................................................................................... 597
Strumienie bajtw ........................................................................................................ 597
Klasa InputStream .................................................................................................. 598
Klasa OutputStream ............................................................................................... 598
Klasa FileInputStream ............................................................................................ 599
Klasa FileOutputStream ......................................................................................... 601
Klasa ByteArrayInputStream ................................................................................. 602
Klasa ByteArrayOutputStream ............................................................................... 603
Filtrowane strumienie bajtw ................................................................................. 605
Buforowane strumienie bajtw .............................................................................. 605
Klasa SequenceInputStream ................................................................................... 609
Klasa PrintStream ................................................................................................... 610
Klasy DataOutputStream i DataInputStream .......................................................... 613
Klasa RandomAccessFile ....................................................................................... 615
Strumienie znakw ....................................................................................................... 616
Klasa Reader .......................................................................................................... 616
Klasa Writer ........................................................................................................... 616
Klasa FileReader .................................................................................................... 616
Klasa FileWriter ..................................................................................................... 618

Spis treci

13
Klasa CharArrayReader ......................................................................................... 619
Klasa CharArrayWriter .......................................................................................... 620
Klasa BufferedReader ............................................................................................ 621
Klasa BufferedWriter ............................................................................................. 623
Klasa PushbackReader ........................................................................................... 623
Klasa PrintWriter ................................................................................................... 624
Stosowanie operacji wejcia-wyjcia na strumieniach ................................................. 626
Usprawnienie metody wc() przez zastosowanie klasy StreamTokenizer ............... 627
Serializacja ................................................................................................................... 629
Interfejs Serializable ............................................................................................... 630
Interfejs Externalizable .......................................................................................... 630
Interfejs ObjectOutput ............................................................................................ 631
Klasa ObjectOutputStream ..................................................................................... 631
Interfejs ObjectInput .............................................................................................. 633
Klasa ObjectInputStream ....................................................................................... 633
Przykad serializacji ............................................................................................... 634
Korzyci wynikajce ze stosowania strumieni ............................................................. 636

Rozdzia 20. Obsuga sieci ................................................................................ 637


Podstawy obsugi sieci ................................................................................................. 637
Przegld gniazd ...................................................................................................... 638
Klient-serwer .......................................................................................................... 638
Gniazda zastrzeone ............................................................................................... 639
Serwery poredniczce ........................................................................................... 639
Obsuga adresw internetowych ............................................................................ 640
Java i usugi sieciowe ................................................................................................... 641
Klasy i interfejsy obsugujce komunikacj sieciow ............................................ 641
Klasa InetAddress ......................................................................................................... 642
Metody fabryczne ................................................................................................... 642
Metody klasy .......................................................................................................... 643
Klasy Inet4Address oraz Inet6Address ........................................................................ 644
Gniazda klientw TCP/IP ............................................................................................. 644
Przykad uycia usugi whois ................................................................................. 645
URL .............................................................................................................................. 646
Format .................................................................................................................... 647
Klasa URLConnection ................................................................................................. 648
Gniazda serwerw TCP/IP ........................................................................................... 651
Serwer poredniczcy protokou HTTP z pamici podrczn .................................... 651
Kod rdowy ......................................................................................................... 652
Datagramy .................................................................................................................... 672
Klasa DatagramPacket ........................................................................................... 672
Przesyanie datagramw pomidzy serwerem a klientem ...................................... 673
Klasa URI ..................................................................................................................... 674
Nowe klasy rodowiska J2SE 5 .................................................................................... 675

Rozdzia 21. Klasa Applet ................................................................................. 677


Podstawy apletw ......................................................................................................... 677
Klasa Applet ........................................................................................................... 678
Architektura apletu ....................................................................................................... 680
Szkielet apletu .............................................................................................................. 681
Inicjalizacja i przerywanie dziaania apletu ............................................................ 682
Przysanianie metody update() ............................................................................... 684
Proste metody wywietlania skadnikw apletw ........................................................ 684
danie ponownego wywietlenia ................................................................................ 686
Prosty aplet z paskiem reklamowym ...................................................................... 688

14

Java. Kompendium programisty


Wykorzystywanie paska stanu ...................................................................................... 690
Znacznik APPLET jzyka HTML ................................................................................ 691
Przekazywanie parametrw do apletw ....................................................................... 692
Udoskonalenie apletu z paskiem reklamowym ...................................................... 694
Metody getDocumentBase() i getCodeBase() .............................................................. 695
Interfejs AppletContext i metoda showDocument() ..................................................... 696
Interfejs AudioClip ....................................................................................................... 698
Interfejs AppletStub ..................................................................................................... 698
Wywietlanie danych wyjciowych na konsoli ............................................................ 698

Rozdzia 22. Obsuga zdarze ............................................................................ 699


Dwa mechanizmy obsugi zdarze ............................................................................... 699
Model obsugi zdarze oparty na ich delegowaniu ....................................................... 700
Zdarzenia ................................................................................................................ 700
rda zdarze ........................................................................................................ 701
Obiekty nasuchujce zdarze ................................................................................ 702
Klasy zdarze ............................................................................................................... 702
Klasa ActionEvent ................................................................................................. 704
Klasa AdjustmentEvent .......................................................................................... 704
Klasa ComponentEvent .......................................................................................... 705
Klasa ContainerEvent ............................................................................................. 706
Klasa FocusEvent ................................................................................................... 706
Klasa InputEvent .................................................................................................... 707
Klasa ItemEvent ..................................................................................................... 708
Klasa KeyEvent ...................................................................................................... 709
Klasa MouseEvent ................................................................................................. 710
Klasa MouseWheelEvent ....................................................................................... 712
Klasa TextEvent ..................................................................................................... 713
Klasa WindowEvent ............................................................................................... 713
rda zdarze .............................................................................................................. 714
Interfejsy nasuchujce zdarze .................................................................................... 715
Interfejs ActionListener .......................................................................................... 715
Interfejs AdjustmentListener .................................................................................. 715
Interfejs ComponentListener .................................................................................. 716
Interfejs ContainerListener ..................................................................................... 717
Interfejs FocusListener ........................................................................................... 717
Interfejs ItemListener ............................................................................................. 717
Interfejs KeyListener .............................................................................................. 717
Interfejs MouseListener .......................................................................................... 717
Interfejs MouseMotionListener .............................................................................. 718
Interfejs MouseWheelListener ............................................................................... 718
Interfejs TextListener ............................................................................................. 718
Interfejs WindowFocusListener ............................................................................. 718
Interfejs WindowListener ....................................................................................... 719
Stosowanie modelu delegowania zdarze .................................................................... 719
Obsuga zdarze generowanych przez mysz .......................................................... 720
Obsuga zdarze generowanych przez klawiatur .................................................. 722
Klasy adapterw ........................................................................................................... 726
Klasy wewntrzne ........................................................................................................ 728
Anonimowa klasa wewntrzna ............................................................................... 729

Rozdzia 23. Wprowadzenie do AWT: praca z oknami, grafik i tekstem ............. 731
Klasy AWT .................................................................................................................. 732
Podstawy okien ............................................................................................................ 734
Klasa Component ................................................................................................... 734
Klasa Container ...................................................................................................... 735

Spis treci

15
Klasa Panel ............................................................................................................. 735
Klasa Window ........................................................................................................ 735
Klasa Frame ........................................................................................................... 736
Klasa Canvas .......................................................................................................... 736
Praca z oknami typu Frame .......................................................................................... 736
Ustawianie wymiarw okna ................................................................................... 737
Ukrywanie i wywietlanie okna ............................................................................. 737
Ustawianie tytuu okna ........................................................................................... 737
Zamykanie okna typu Frame .................................................................................. 737
Tworzenie okna typu Frame z poziomu apletu ............................................................. 738
Obsuga zdarze w oknie typu Frame .................................................................... 740
Tworzenie programu wykorzystujcego okna .............................................................. 743
Wywietlanie informacji w oknie ................................................................................. 745
Praca z grafik .............................................................................................................. 746
Rysowanie prostych ............................................................................................... 746
Rysowanie prostoktw ......................................................................................... 747
Rysowanie elips, k i okrgw ............................................................................. 748
Rysowanie ukw ................................................................................................... 749
Rysowanie wieloktw .......................................................................................... 750
Dostosowywanie rozmiarw obiektw graficznych ............................................... 751
Praca z klas Color ....................................................................................................... 752
Metody klasy Color ................................................................................................ 753
Ustawianie biecego koloru kontekstu graficznego .............................................. 754
Aplet demonstrujcy zastosowanie klasy Color ..................................................... 754
Ustawianie trybu rysowania ......................................................................................... 755
Praca z czcionkami ....................................................................................................... 757
Okrelanie dostpnych czcionek ............................................................................ 757
Tworzenie i wybieranie czcionek ........................................................................... 759
Uzyskiwanie informacji o czcionkach .................................................................... 761
Zarzdzanie tekstowymi danymi wyjciowymi
z wykorzystaniem klasy FontMetrics ......................................................................... 762
Wywietlanie tekstu w wielu wierszach ................................................................. 763
Wyrodkowanie tekstu ........................................................................................... 766
Wyrwnywanie wielowierszowych danych tekstowych ........................................ 767

Rozdzia 24. Stosowanie kontrolek AWT, menaderw ukadu graficznego


oraz menu .................................................................................... 771
Podstawy kontrolek ...................................................................................................... 772
Dodawanie i usuwanie kontrolek ........................................................................... 772
Odpowiadanie na zdarzenia kontrolek ................................................................... 772
Etykiety ........................................................................................................................ 773
Stosowanie przyciskw ................................................................................................ 774
Obsuga zdarze przyciskw .................................................................................. 775
Stosowanie pl wyboru ................................................................................................ 777
Obsuga zdarze pl wyboru .................................................................................. 778
CheckboxGroup ........................................................................................................... 780
Kontrolki list rozwijanych ............................................................................................ 782
Obsuga zdarze list rozwijanych ........................................................................... 783
Stosowanie list ............................................................................................................. 784
Obsuga zdarze generowanych przez listy ............................................................ 786
Zarzdzanie paskami przewijania ................................................................................. 787
Obsuga zdarze generowanych przez paski przewijania ....................................... 789
Stosowanie kontrolek typu TextField ........................................................................... 790
Obsuga zdarze generowanych przez kontrolk TextField ................................... 792
Stosowanie kontrolek typu TextArea ........................................................................... 794

16

Java. Kompendium programisty


Wprowadzenie do menaderw ukadu graficznego komponentw ............................. 795
FlowLayout ............................................................................................................ 797
BorderLayout ......................................................................................................... 799
Stosowanie obramowa .......................................................................................... 800
GridLayout ............................................................................................................. 801
Klasa CardLayout ................................................................................................... 803
Klasa GridBagLayout ............................................................................................. 806
Menu i paski menu ....................................................................................................... 811
Okna dialogowe ............................................................................................................ 817
FileDialog ..................................................................................................................... 822
Obsuga zdarze przez rozszerzanie dostpnych komponentw AWT ........................ 823
Rozszerzanie kontrolki Button ............................................................................... 824
Rozszerzanie kontrolki Checkbox .......................................................................... 825
Rozszerzanie komponentu grupy pl wyboru ........................................................ 826
Rozszerzanie kontrolki Choice ............................................................................... 827
Rozszerzanie kontrolki List .................................................................................... 828
Rozszerzanie kontrolki Scrollbar ........................................................................... 829
Poznawanie rodowiska kontrolek, menu i menaderw ukadu .................................. 830

Rozdzia 25. Obrazy .......................................................................................... 831


Formaty plikw ............................................................................................................ 832
Podstawy przetwarzania obrazw: tworzenie, wczytywanie i wywietlanie ................ 832
Tworzenie obiektu obrazu ...................................................................................... 832
Wczytywanie obrazu .............................................................................................. 833
Wywietlanie obrazu .............................................................................................. 833
Interfejs ImageObserver ............................................................................................... 835
Podwjne buforowanie ................................................................................................. 836
Klasa MediaTracker ..................................................................................................... 839
Interfejs ImageProducer ............................................................................................... 842
Klasa MemoryImageSource ................................................................................... 843
Interfejs ImageConsumer ............................................................................................. 844
Klasa PixelGrabber ................................................................................................ 845
Klasa ImageFilter ......................................................................................................... 847
Klasa CropImageFilter ........................................................................................... 848
Klasa RGBImageFilter ........................................................................................... 850
Animacja poklatkowa ................................................................................................... 861
Dodatkowe klasy obsugujce obrazy ........................................................................... 863

Rozdzia 26. Narzdzia wspbienoci .............................................................. 865


Pakiety interfejsu Concurrent API................................................................................. 866
java.util.concurrent ................................................................................................. 866
java.util.concurrent.atomic ..................................................................................... 867
java.util.concurrent.locks ....................................................................................... 867
Korzystanie z obiektw sucych do synchronizacji ................................................... 868
Semaphore .............................................................................................................. 868
Klasa CountDownLatch ......................................................................................... 874
CyclicBarrier .......................................................................................................... 875
Klasa Exchanger ..................................................................................................... 878
Korzystanie z egzekutorw .......................................................................................... 880
Przykad prostego egzekutora ................................................................................ 881
Korzystanie z interfejsw Callable i Future ........................................................... 883
Obiekty typu TimeUnit ................................................................................................ 885
Kolekcje wspbiene ................................................................................................... 887
Blokady ........................................................................................................................ 887
Operacje atomowe ........................................................................................................ 890
Pakiet Concurrency Utilities a tradycyjne metody jzyka Java .................................... 891

Spis treci

17

Rozdzia 27. System NIO, wyraenia regularne i inne pakiety ............................. 893
Pakiety gwnego API jzyka Java ............................................................................... 893
System NIO .................................................................................................................. 895
Podstawy systemu NIO .......................................................................................... 896
Zestawy znakw i selektory ................................................................................... 898
Korzystanie z systemu NIO .................................................................................... 899
Czy system NIO jest przyszoci operacji wejcia-wyjcia? ................................ 905
Przetwarzanie wyrae regularnych ............................................................................. 905
Klasa Pattern .......................................................................................................... 906
Klasa Matcher ........................................................................................................ 906
Skadnia wyrae regularnych ............................................................................... 907
Przykad wykorzystania dopasowywania do wzorca .............................................. 908
Typy operacji dopasowywania do wzorca .............................................................. 913
Przegld wyrae regularnych ............................................................................... 914
Refleksje ....................................................................................................................... 914
Zdalne wywoywanie metod (RMI) .............................................................................. 917
Prosta aplikacja typu klient-serwer wykorzystujca RMI ...................................... 918
Formatowanie tekstu .................................................................................................... 921
Klasa DateFormat ................................................................................................... 921
Klasa SimpleDateFormat ....................................................................................... 923

Cz III Pisanie oprogramowania w jzyku Java ........................927


Rozdzia 28. Java Beans ................................................................................... 929
Czym jest komponent typu Java Bean? ........................................................................ 929
Zalety komponentw Java Beans ................................................................................. 930
Introspekcja .................................................................................................................. 930
Wzorce waciwoci ............................................................................................... 931
Wzorce projektowe dla zdarze ............................................................................. 932
Metody i wzorce projektowe .................................................................................. 932
Korzystanie z interfejsu BeanInfo .......................................................................... 933
Waciwoci ograniczone ............................................................................................. 933
Trwao ....................................................................................................................... 934
Interfejs Customizer ..................................................................................................... 934
Interfejs Java Beans API .............................................................................................. 934
Klasa Introspector .................................................................................................. 936
Klasa PropertyDescriptor ....................................................................................... 937
Klasa EventSetDescriptor ...................................................................................... 937
Klasa MethodDescriptor ........................................................................................ 937
Przykad komponentu typu Bean .................................................................................. 937

Rozdzia 29. Przewodnik po pakiecie Swing ...................................................... 941


Klasa JApplet ............................................................................................................... 942
Klasy JFrame i JComponent ......................................................................................... 943
Ikony i etykiety ............................................................................................................. 943
Problemy z wtkami ..................................................................................................... 945
Pola tekstowe ................................................................................................................ 947
Przyciski ....................................................................................................................... 948
Klasa JButton ......................................................................................................... 949
Pola wyboru ........................................................................................................... 951
Przyciski opcji......................................................................................................... 953
Listy kombinowane ...................................................................................................... 955
Okna z zakadkami ....................................................................................................... 957
Okna przewijane ........................................................................................................... 959
Drzewa ......................................................................................................................... 961
Przegld pakietu Swing ................................................................................................ 965

18

Java. Kompendium programisty

Rozdzia 30. Serwlety ....................................................................................... 967


Podstawy ...................................................................................................................... 967
Cykl ycia serwletu ...................................................................................................... 968
Korzystanie ze rodowiska Tomcat .............................................................................. 969
Przykad prostego serwletu ........................................................................................... 970
Tworzenie i kompilacja kodu rdowego serwletu ............................................... 971
Uruchamianie rodowiska Tomcat ......................................................................... 971
Uruchamianie przegldarki i generowanie dania ................................................ 972
Interfejs Servlet API ..................................................................................................... 972
Pakiet javax.servlet ....................................................................................................... 972
Interfejs Servlet ...................................................................................................... 973
Interfejs ServletConfig ........................................................................................... 974
Interfejs ServletContext .......................................................................................... 974
Interfejs ServletRequest ......................................................................................... 975
Interfejs ServletResponse ....................................................................................... 975
Klasa GenericServlet .............................................................................................. 976
Klasa ServletInputStream ....................................................................................... 976
Klasa ServletOutputStream .................................................................................... 977
Klasy wyjtkw zwizanych z serwletami ............................................................. 977
Odczytywanie parametrw serwletu ............................................................................. 977
Pakiet javax.servlet.http ............................................................................................... 979
Interfejs HttpServletRequest .................................................................................. 979
Interfejs HttpServletResponse ................................................................................ 979
Interfejs HttpSession .............................................................................................. 980
Interfejs HttpSessionBindingListener .................................................................... 981
Klasa Cookie .......................................................................................................... 981
Klasa HttpServlet ................................................................................................... 983
Klasa HttpSessionEvent ......................................................................................... 983
Klasa HttpSessionBindingEvent ............................................................................ 984
Obsuga da i odpowiedzi HTTP .............................................................................. 985
Obsuga da HTTP GET ..................................................................................... 985
Obsuga da HTTP POST .................................................................................. 986
Korzystanie ze znacznikw kontekstu uytkownika ..................................................... 988
ledzenie sesji .............................................................................................................. 990

Cz IV Zastosowanie Javy w praktyce ....................................993


Rozdzia 31. Aplety i serwlety finansowe ........................................................... 995
Znajdowanie raty poyczki ........................................................................................... 996
Pola apletu .............................................................................................................. 999
Metoda init() ........................................................................................................ 1000
Metoda actionPerformed() ................................................................................... 1002
Metoda paint() ...................................................................................................... 1002
Metoda compute() ................................................................................................ 1003
Znajdowanie przyszej wartoci inwestycji ................................................................ 1004
Znajdowanie wkadu pocztkowego wymaganego
do uzyskania przyszej wartoci inwestycji .............................................................. 1007
Znalezienie inwestycji pocztkowej wymaganej
do uzyskania odpowiedniej emerytury ..................................................................... 1011
Znajdowanie maksymalnej emerytury dla danej inwestycji ....................................... 1015
Obliczenie pozostaej kwoty do spaty kredytu .......................................................... 1019
Tworzenie serwletw finansowych ............................................................................ 1022
Konwersja apletu RegPay do serwletu ................................................................. 1023
Serwlet RegPayS .................................................................................................. 1023
Moliwe rozszerzenia ................................................................................................. 1026

Spis treci

19

Rozdzia 32. Wykonanie menedera pobierania plikw w Javie ......................... 1027


Sposoby pobierania plikw z internetu ....................................................................... 1028
Omwienie programu ................................................................................................. 1028
Klasa Download ......................................................................................................... 1029
Zmienne pobierania .............................................................................................. 1033
Konstruktor klasy ................................................................................................. 1033
Metoda download() .............................................................................................. 1033
Metoda run() ........................................................................................................ 1033
Metoda stateChanged() ........................................................................................ 1037
Metody akcesorowe i dziaa ............................................................................... 1037
Klasa ProgressRenderer ............................................................................................. 1037
Klasa DownloadsTableModel .................................................................................... 1038
Metoda addDownload() ....................................................................................... 1040
Metoda clearDownload() ..................................................................................... 1041
Metoda getColumnClass() .................................................................................... 1041
Metoda getValueAt() ........................................................................................... 1041
Metoda update() ................................................................................................... 1042
Klasa DownloadManager ........................................................................................... 1042
Zmienne klasy DownloadManager ....................................................................... 1047
Konstruktor klasy ................................................................................................. 1048
Metoda verifyUrl() ............................................................................................... 1048
Metoda tableSelectionChanged() ......................................................................... 1049
Metoda updateButtons() ....................................................................................... 1049
Obsuga zdarze akcji .......................................................................................... 1050
Kompilacja i uruchamianie programu ........................................................................ 1051
Rozszerzanie moliwoci programu ........................................................................... 1051

Dodatki ....................................................................................1053
Dodatek A Korzystanie z komentarzy dokumentacyjnych Javy ....................... 1055
Znaczniki komentarzy dokumentacyjnych ................................................................. 1055
Znacznik @author ................................................................................................ 1056
Znacznik {@code} ............................................................................................... 1057
Znacznik @deprecated ......................................................................................... 1057
Znacznik {@docRoot} ......................................................................................... 1057
Znacznik @exception ........................................................................................... 1057
Znacznik {@inheritDoc} ..................................................................................... 1057
Znacznik {@link} ................................................................................................ 1057
Znacznik {@linkplain} ........................................................................................ 1058
Znacznik {@literal} ............................................................................................. 1058
Znacznik @param ................................................................................................ 1058
Znacznik @return ................................................................................................. 1058
Znacznik @see ..................................................................................................... 1058
Znacznik @serial ................................................................................................. 1059
Znacznik @serialData .......................................................................................... 1059
Znacznik @serialField ......................................................................................... 1059
Znacznik @since .................................................................................................. 1059
Znacznik @throws ............................................................................................... 1059
Znacznik {@value} .............................................................................................. 1059
Znacznik @version .............................................................................................. 1060
Oglna posta komentarzy dokumentacyjnych .......................................................... 1060
Wynik dziaania narzdzia javadoc ............................................................................ 1060
Przykad korzystajcy z komentarzy dokumentacyjnych ........................................... 1061

Skorowidz ................................................................................... 1063

Rozdzia 3.

Typy danych, zmienne


i tablice
Ten rozdzia dotyczy trzech najbardziej podstawowych elementw Javy: typw danych,
zmiennych i tablic. Podobnie jak wszystkie nowoczesne jzyki programowania, Java
obsuguje kilka podstawowych typw danych. Uywamy tych typw do deklarowania
zmiennych i tworzenia tablic. Rozwizanie proponowane w tej kwestii przez Jav jest
czyste, wydajne i spjne.

Java to jzyk ze cis kontrol typw


Trzeba podkreli, i Java jest jzykiem ze cis kontrol typw. Midzy innymi wanie
z tego stwierdzenia bierze si bezpieczestwo i solidno Javy. Przekonajmy si, co
to oznacza. Po pierwsze, kada zmienna ma cile okrelony typ, kade wyraenie ma
typ. Kady typ jest dokadnie zdefiniowany. Po drugie, wszystkie przypisania, jawne lub
przez parametry w wywoaniach metod, s sprawdzane pod ktem zgodnoci typw.
Nie istnieje automatyczna konwersja niezgodnych typw wystpujca w niektrych
innych jzykach programowania. Kompilator Javy sprawdza wszystkie wyraenia i parametry, aby sprawdzi, czy typy s zgodne. Wszelkie niezgodnoci powoduj zgoszenie bdw, ktre musz zosta poprawione, by doprowadzi kompilacj klasy do
szczliwego koca.

Typy proste
Jzyk Java definiuje osiem prostych typw danych: , ,
, 
, ,
  i  
. Typy proste nazywane s czasem typami podstawowymi. W ksice
oba stwierdzenia bd stosowane zamiennie. Typy proste dzielimy na cztery grupy:

Cz I Jzyk Java

64

 typy cakowite do tej grupy nale typy , ,


 i 
,

ktre zawsze okrelaj liczby cakowite ze znakiem;


 typy zmiennoprzecinkowe do tej grupy nale typy  i  ,

ktre reprezentuj liczby z uamkami;


 typy znakowe ta grupa zawiera tylko typ , ktry reprezentuje

pojedynczy znak, na przykad liter lub cyfr;


 typy logiczne ta grupa zawiera tylko typ  
, ktry jest specjalnym

typem reprezentujcym wartoci typu prawda lub fasz.


Przedstawione typy mona stosowa w oryginalnej postaci, tworzy z nich tablice lub na
ich podstawie kreowa wasne klasy (klasa definiuje nowy typ danych). Innymi sowy,
typy te stanowi podstaw wszelkich innych typw tworzonych w programie.
Typy proste reprezentuj pojedyncze wartoci nie s zoonymi obiektami. Jest to
w zasadzie jedyne odstpstwo od w peni obiektowego modelu w jzyku Java. Powd
takiego rozwizania jest bardzo prosty wydajno. Uczynienie z typw prostych
obiektw spowodowaoby zbyt znaczcy spadek wydajnoci.
Typy proste maj cile okrelony zakres wartoci i zachowanie w operacjach matematycznych. Jzyki takie jak C lub C++ pozwalaj, aby rozmiar typu
 zmienia si
w zalenoci od wykorzystywanego rodowiska. W Javie jest inaczej. Przenono programw Javy wymaga, aby wszystkie typy miay cile zdefiniowany zakres. Na przykad typ
 jest zawsze 32-bitowy, niezalenie od platformy sprztowej. W ten sposb
programista ma pewno, e napisany przez niego program bdzie dziaa poprawnie
na innej architekturze systemowej bez dokonywania adnych modyfikacji. Cho takie
wymuszanie rozmiaru typw cakowitych potrafi zmniejszy wydajno w pewnych
rodowiskach, jest wymogiem przenonoci.
Przyjrzyjmy si po kolei poszczeglnym typom danych.

Typy cakowite
Java definiuje cztery typy cakowite: , ,
 oraz 
. Wszystkie te typy mog
przechowywa wartoci ze znakiem, czyli liczby ujemne i dodatnie. Java nie obsuguje
typw bez znaku. Cho wikszo innych jzykw programowania obsuguje liczby
cakowite z i bez znaku, projektanci Javy stwierdzili, e takie rozrnienie nie jest
potrzebne. Koncepcja bez znaku bya najczciej stosowana do sterowania zachowaniem najbardziej znaczcego bitu liczby, ktry definiuje znak. W rozdziale 4. dokadnie omwi operator przesunicia w prawo bez znaku, ktry praktycznie eliminuje potrzeb stosowania typw bezznakowych.
Rozmiaru typu cakowitego nie naley rozumie jako liczby bitw zajmowanych przez
dany typ, ale raczej jako zachowanie zdefiniowane dla danego typu. rodowisku wykonawcze Javy moe wewntrznie uywa dowolnej liczby bitw dla danego typu, o ile
zachowuje si on tak, jak powinien. W rzeczywistoci typy  i  s zewntrznie

Rozdzia 3. Typy danych, zmienne i tablice

65

zaimplementowane jako liczby 32-bitowe (zamiast 8- i 16-bitowych), aby poprawi


wydajno, gdy wanie taki jest rozmiar sowa wikszoci komputerw osobistych.
Rozmiar i zakres typw cakowitych s bardzo rne, co przedstawia tabela 3.1.
Tabela 3.1. Rozmiar i zakres typw cakowitych
Nazwa

Rozmiar

Zakres



64

od 9 223 372 036 854 775 808 do 9 223 372 036 854 775 807



32

od 2 147 483 648 do 2 147 483 647

 

16

od 32 768 do 32 767

od 128 do 127

Przyjrzyjmy si poszczeglnym typom liczb cakowitych.

Typ byte
Najmniejszym typem cakowitym jest . Jest to 8-bitowy typ znakowy od zakresie
od 128 do 127. Zmienne typu  s szczeglne przydatne wtedy, gdy przetwarza
si strumie danych odczytany z pliku lub otrzymany przez sie. Poza tym przydaje
si do obrbki surowych danych binarnych, ktre mog nie by bezporednio zgodne
z innymi wbudowanymi typami.
Zmienne bajtowe deklaruje si za pomoc sowa kluczowego . Poniszy przykad
deklaruje dwie zmienne bajtowe o nazwach  i .

 

Typ short
Typ  to typ 16-bitowy o zakresie od 32 768 do 32 767. Prawdopodobnie jest to
najrzadziej stosowany typ danych, poniewa jest on tak zdefiniowany e jego pierwszy
bit jest najbardziej znaczcy (tak zwany format big-endian). Typ ten jest najlepszy dla
komputerw 16-bitowych, ktre w zasadzie ju wymary.
Oto kilka przykadw deklaracji zmiennych tego typu.
 
 

Okrelenia endian wskazuj na sposb w przechowywania w pamici typw wielobajtowych takich jak  ,  lub . Typ   skada si z dwch bajtw, ale
ktry z tych bajtw ma by bardziej znaczcy: pierwszy czy drugi? Mwimy, e procesor jest typu big-endian, jeli najpierw pojawia si bardziej znaczcy bajt, a dopiero po nim mniej znaczcy. Procesory takie jak SPARC lub PowerPC s typu bigendian, natomiast procesory serii Intell x86 s typu little-endian.

Cz I Jzyk Java

66

Typ int
Prawdopodobnie najczciej stosowanym typem jest 32-bitowy typ
 o zakresie od
2 147 483 648 do 2 147 483 647. Poza innymi zastosowaniami, zmienne tego typu s
najczciej wykorzystywane w strukturach sterujcych lub jako indeksy tablic. Jeli
jakie wyraenie zawiera zlepek zmiennych typu , ,
 i staych liczb, jest ono
automatycznie konwertowane do typu
 przed dokonaniem jakichkolwiek oblicze.
Typ
 jest najbardziej elastyczny i wydajny, wic powinien by stosowany zawsze
wtedy, gdy trzeba zlicza wartoci, przechodzi po kolejnych elementach tablicy lub
wykonywa dziaania arytmetyczne na liczbach cakowitych. Cho moe si wydawa,
i typy  i  pozwalaj zaoszczdzi miejsce, nie ma adnej gwarancji, i wewntrznie nie bd reprezentowane przez typ
. Pamitaj, e typ okrela zachowanie,
a nie rzeczywisty rozmiar. (Jedynym wyjtkiem s tablice, w ktrych gwarantuje si,
e typ  bdzie zajmowa tylko jeden bajt na element, typ  2 bajty na element, a typ
 4 bajty na element).

Typ long
Typ 
to 64-bitowy typ stosowany wszdzie tam, gdzie wiadomo, i zakres typu

nie jest wystarczajcy. Zakres typu 
jest naprawd imponujcy, wic przydaje si
w momencie wykonywania oblicze na bardzo duych liczbach. Poniej znajduje si przykadowy program, ktry oblicza liczb kilometrw, jak przebdzie wiato w podanej
liczbie dni.
Obliczanie odlegoci przebytej przez wiato za pomoc zmiennych typu long.



  

  






przybliona prdko wiata w kilometrach na sekund

 !!!
!!!okrelenie liczby dni
"#$" !" !konwersja na sekundy


"obliczenie odlegoci
%&%
'(')
%&%
'
*+
,-.-
'
%&%

)'/
0+%'
1
1

Wykonanie programu spowoduje wywietlenie nastpujcego komunikatu.


(!!!
*+
,-.-
#23#!!!!!!!!!!/
0+%

Z pewnoci taki wynik nie zmieciby si w zmiennej typu


.

Rozdzia 3. Typy danych, zmienne i tablice

67

Typy zmiennoprzecinkowe
Liczby zmiennoprzecinkowe, nazywane rwnie liczbami rzeczywistymi, stosowane s
zawsze tam, gdzie potrzebna jest informacja z dokadnoci do uamkw liczb. Wykonywanie oblicze takich jak pierwiastek kwadratowy lub sinus wymaga zastosowania
typu o bardzo wysokiej precyzji, czyli typu zmiennoprzecinkowego. Java implementuje standardowy (IEEE-754) zbir typw i operatorw zmiennoprzecinkowych. Istniej
dwa typy zmiennoprzecinkowe,  i  , ktre odpowiadaj liczbom pojedynczej i podwjnej precyzji. Tabela 3.2 przedstawia rozmiar i zakresy obu typw.
Tabela 3.2. Rozmiary i zakresy typw zmiennoprzecinkowych
Nazwa

Rozmiar

Przybliony zakres




64

od 4.9e324 do 1.8e+308



32

od 1.4e045 do 3.4e+038

Oba typy omawiam w kolejnych punktach.

Typ float
Typ  okrela warto zmiennoprzecinkow pojedynczej precyzji, ktra uywa
32 bajtw pamici. Pojedyncza precyzja jest szybsza na niektrych procesorach i zajmuje dwa razy mniej miejsca od podwjnej precyzji, ale z drugiej strony jest mniej dokadna dla bardzo maych lub bardzo duych wartoci. Zmienne typu  przydaj
si wtedy, gdy potrzebna jest cz uamkowa, ale nie zaley nam na duej precyzji.
Na przykad, ten typ doskonale nadaje si do reprezentacji zotwek i groszy.
Oto przykad deklaracji zmiennych typu .

4 +

Typ double
Zmienne o podwjnej precyzji zajmujcej 64-bity oznacza si za pomoc sowa kluczowego  . Niektre nowoczesne procesory potrafi szybciej wykonywa obliczenia na liczbach podwjnej precyzji, gdy zostay odpowiednio zoptymalizowane.
Wszystkie funkcje trygonometryczne i nie tylko , , 
 zwracaj
wartoci typu  . Jeli trzeba zachowa dobr dokadno dla wielu iteracyjnie
wykonywanych oblicze lub obsugiwa bardzo due liczby, typ   jest najlepszym
wyborem.
Poniszy program wykorzystuje zmienne typu   do obliczenia pola koa.
 Obliczenie pola koa.
5

  

  

 


Cz I Jzyk Java

68
!%promie koa

6%$ przybliona warto pi

""obliczenie pola
%&%
'7/,+
')
1
1

Typ znakowy
W Javie typem danych uywanym do przechowywania znakw jest typ . Programici jzyka C lub C++ powinni jednak uwaa, gdy typ ten nie oznacza dokadnie
tego samego, co w jzyku C. W jzyku C lub C++ typ  to 8-bitowy typ cakowity, ale
w Javie jest cakiem inaczej, gdy do reprezentacji znakw uywa si unikodu. Unikod
(ang. Unicode) definiuje peny zbir znakw uywanych przez wikszo jzykw,
jakimi obecnie posuguj si ludzie na caym wiecie. Jest to unifikacja dziesitek dawnych zbiorw znakw: aciskiego, greckiego, arabskiego, cyrylicy, hebrajskiego, Katakana, Hangul i wielu innych. Z tego powodu unikod wymaga 16 bitw. Poniewa Java
obsuguje unikod, typ  jest 16-bitowy i ma zakres od 0 do 65 535. Nie istniej
ujemne wartoci znakw. Zbir znakw ASCII znajduje si w zakresie od 0 do 127,
a 8-bitowy zbir znakw ISO Latin 1 znajduje si w zakresie od 0 do 255. Poniewa
Java zostaa tak zaprojektowana, aby jej aplety mogy by uruchamiane na caym wiecie, zastosowanie unikodu do reprezentacji znakw wydaje si sensownym wyborem.
Oczywicie unikod jest mniej wydajny dla jzykw takich jak angielski, niemiecki czy
francuski, ktre atwo mieciyby si w 8 bitach. Zapewnienie globalnej przenonoci
ma swoj cen.
Wicej informacji na temat kodowania znakw Unicode znajduje si na witrynie
www.unicode.org.

Poniej znajduje si prosty program obrazujcy wykorzystanie zmiennych typu .


Przykad uycia typu danych char.
8 9

  

  
    #
 kod dla X
 #:;:
%&%
' 
 #<'
%&%
 )'') #
1
1

Wykonanie programu spowoduje wywietlenie nastpujcego wyniku.


 
 #<=;

Rozdzia 3. Typy danych, zmienne i tablice

69

Zauwa, e zmiennej ch1 zostaa przypisana warto 88, ktra w kodzie ASCII i Unicode odpowiada znakowi X. Jak wspomniaem, zbir znakw ASCII zajmuje pierwsze
127 znakw zbioru znakw Unicode. Z tego powodu w Javie nadal mona stosowa
wiele sztuczek ze znakami.
Cho typ  nie jest typem cakowitym, to jednak w wielu sytuacjach dziaa dokadnie tak samo jak typ
. Umoliwia dodanie dwch znakw do siebie lub zwikszenie wartoci zmiennej znakowej. Rozwamy nastpujcy program.
Zmienne typu char zachowuj si jak zmienne typu int.
8 9#

  

  
   
 :=:
%&%
' -+
-/') 
 ))inkrementacja ch1
%&%
'- +*>') 
1
1

Wykonanie programu spowoduje wywietlenie nastpujcego wyniku.


 -+
-/=
- +*>;

W programie zmienna  najpierw przyjmuje warto . Nastpnie jest inkrementowana. Po tej operacji zmienna  zawiera warto , czyli nastpny znak w cigu
znakw ASCII (i Unicode).

Typ logiczny
Java posiada typ prosty dla wartoci logicznych o nazwie  
. Moe on przyj
tylko jedn z dwch wartoci:
 (prawda) lub  (fasz). Ten wanie typ zwracaj wszystkie operatory relacji, na przykad . Co wicej, typ  
jest wymagany przez wszystkie wyraenia warunkowe w strukturach sterujcych takich jak
oraz .
Poniszy program obrazuje wykorzystanie typu  
.
Przykad uycia typu boolean.
?@

  

  

 
4
%&%
'+
')
&
%&%
'+
')
warto logiczna potrafi sterowa instrukcj if

Cz I Jzyk Java

70
%&%
'@-,+/%'
4
%&%
'@
-,+/%'
wynik operatora relacji jest wartoci logiczn
%&%
'!A3+*>')!A3
1
1

Wykonanie programu spowoduje wywietlenie nastpujcego wyniku.


+
4
+
&
@-,+/%
!A3+*>&

W tym programie warto zauway trzy interesujce kwestie. Po pierwsze, prba wywietlenia zawartoci zmiennej logicznej powoduje wywietlenie tekstu true lub false.
Po drugie, sama warto zmiennej wystarcza do sterowania dziaaniem instrukcji .
Nie trzeba na przykad pisa nastpujcej konstrukcji.
&%%%

Po trzecie, wynik dziaania operatora relacji, na przykad , jest wartoci typu  
.
Z tego powodu wyraenie  zawsze zwrci warto true. Potrzebujemy dodatkowych nawiasw wok , poniewa operator  ma wyszy priorytet ni operator .

Blisze spojrzenie na literay


W rozdziale 2. pokrtce wspomniaem o literaach. Poniewa omwiem ju podstawowe typy danych, warto dokadniej si im przyjrze.

Literay bdce liczbami cakowitymi


Liczby cakowite s zapewne najczciej stosowanym typem danych w kadym programie komputerowym. Kada liczba cakowita wpisana na stae w programie jest literaem liczbowym. Kilka przykadw: , ,  i . S to wartoci dziesitne, czyli liczby
o podstawie 10. W Javie w literaach cakowitych mona stosowa jeszcze dwie inne
podstawy: semkow (podstawa 8) i szesnastkow (podstawa 16). Wartoci semkowe musz zaczyna si od 0. Liczby dziesitne nie mog mie na pocztku cyfry 0.
Z tego powodu napisanie  spowoduje zgoszenie bdu kompilatora, poniewa 9 wykracza poza zakres liczb semkowych (od 0 do 7). Liczby szesnastkowe s stosowane
przez programistw znacznie czciej ni semkowe, gdy uatwiaj rozrnienie poszczeglnych bajtw liczby. Wartoci szesnastkowe musz zaczyna si od konstrukcji
 lub . Zakres dla liczb szesnastkowych wynosi od 0 do 15, przy czym litery od A do
F (lub od a do f) zastpuj wartoci od 10 do 15.

Rozdzia 3. Typy danych, zmienne i tablice

71

Literay cakowite tworz warto typu


, czyli 32-bitow liczb cakowit. Poniewa Java jest jzykiem o cisej kontroli typw, niektre osoby dziwi si, e mona
przypisa litera cakowity do innego typu, takiego jako  lub 
, bez powodowania bdu kompilatora. Po prostu kompilator potrafi sobie poradzi z takimi sytuacjami. Gdy litera przypisuje si do typu  lub , bd nie jest generowany, jeli
litera reprezentuje warto z przedziau docelowego typu. Litera zawsze zostanie poprawnie przypisany do typu 
. Aby jednak okreli litera typu 
, trzeba jawnie
wskaza kompilatorowi, e dana warto jest typu 
. W tym celu naley doda liter
 lub na kocu literau, na przykad ! lub !"#$!!$#!
w celu przypisania najwikszej dopuszczalnej wartoci typu 
.

Literay zmiennoprzecinkowe
Liczby zmiennoprzecinkowe to wartoci dziesitne wraz z czci uamkow. Mog
zosta podane w notacji standardowej lub naukowej. Notacja standardowa wymaga
podania czci cakowitej liczby i po kropce czci uamkowej, na przykad 2.0, 3.14150
lub 0.6667. Notacja naukowa uywa notacji standardowej, czyli liczby zmiennoprzecinkowej, ale dodatkowo zawiera informacj o potdze liczby 10, przez ktrej warto
trzeba pomnoy wczeniej podan liczb. Eksponent wskazuje si za pomoc znaku
% lub , po ktrym wystpuje dodatnia lub ujemna liczba cakowita oznaczajca potg.
Oto przykady notacji naukowej: "&%,   $%'$ i  .
Domylnie literay zmiennoprzecinkowe traktowane s jako wartoci podwjnej precyzji
(typ  ). Aby wymusi pojedyncz precyzj (typ ), trzeba do staej doda
liter ( lub . Mona te jawnie okreli typ double, dodajc na kocu liter ) lub *.
Domylna podwjna precyzja zajmuje 64 bity pamici, natomiast mniej dokadna pojedyncza precyzja wymaga tylko 32 bitw.

Literay logiczne
Literay logiczne s proste, poniewa istniej tylko dwie wartoci logiczne:
 i .
Wartoci te nie konwertuj si na adn reprezentacj numeryczn. Innymi sowy,
w Javie litera
 nie jest rwny 1, a litera  nie jest rwny 0. Literay mog
by przypisane tylko do zmiennych typu  
lub zosta uyte w operatorach
logicznych.

Literay znakowe
Znaki w Javie s niejako indeksami ze zbioru znakw Unicode. S 16-bitowymi wartociami, ktre mona konwertowa do typu cakowitego lub wykonywa na nich dziaania arytmetyczne takie jak dodawanie i odejmowanie. Litera znakowy zawsze znajduje si
wewntrz apostrofw. Wszystkie znaki ASCII mona wpisa bezporednio w cudzysowach, na przykad , + lub ,. Dla znakw, ktrych nie mona wpisa bezporednio,
istniej specjalne sekwencje sterujce. Na przykad wpisanie znaku apostrofu wymaga
uycia konstrukcji -, a wpisanie znaku nowego wiersza konstrukcji -. Istnieje
take mechanizm bezporedniego wpisania znaku jako wartoci semkowej lub szesnastkowej. Dla notacji semkowej trzeba najpierw wpisa lewy ukonik, a nastpnie

Cz I Jzyk Java

72

poda trzycyfrow liczb, na przykad -   dla litery . Dla notacji szesnastkowej
najpierw trzeba wpisa konstrukcj -, a nastpnie poda cztery cyfry szesnastkowe, na
przykad -"  oznacza liter , natomiast - to jeden ze znakw japoskiego jzyka Katakana. Tabela 3.3 przedstawia dostpne sekwencje sterujce.
Tabela 3.3. Sekwencje sterujce dla znakw
Sekwencja sterujca

Opis

B

Znak jako liczba semkowa (ddd)

B&CCCC

Znak Unicode jako liczba szesnastkowa (xxxx)

B:

Apostrof

B'

Cudzysw

BB

Lewy ukonik

B

Powrt karetki

B

Nowy wiersz (nazywany rwnie przesuniciem papieru)

B4

Wysunicie kartki

B

Znak tabulacji

B

Cofnicie

Literay tekstowe
Cigi znakw w Javie okrela si tak samo, jak w wikszoci innych jzykw umieszczajc tekst midzy cudzysowami. Oto kilka przykadw cigw znakw.
'(
D*+

'
'+B+
-'
'B'@/+&-,+ %B''

W literaach tekstowych dziaaj dokadnie te same sekwencje sterujce co w przypadku znakw. Java wymaga, aby cig znakw zaczyna si i koczy w tym samym
wierszu. Nie istnieje co takiego jak znak sterujcy kontynuacji wiersza, jak w niektrych innych jzykach programowania.
W niektrych jzykach, na przykad C lub C++, cigi znakw s zaimplementowane
jako tablice znakw. W Javie jest inaczej. Cigi znakw (typ 
 ) s tak naprawd
obiektami. Poniewa w Javie zaimplementowano teksty jako obiekty, ich wykorzystanie jest zarwno bardzo proste, jak i wyjtkowo rozbudowane.

Zmienne
Zmienna to podstawowa jednostka przechowywania informacji w programie Javy.
Zmienn deklaruje si przez podanie nazwy identyfikatora, typu i opcjonalnej inicjalizacji. Poza tym wszystkie zmienne maj okrelony zasig, ktry okrela ich widoczno i czas ycia. Tymi aspektami zajm si nieco pniej.

Rozdzia 3. Typy danych, zmienne i tablice

73

Deklaracja zmiennej
W Javie wszystkie zmienne trzeba zadeklarowa, zanim si z nich skorzysta. Podstawowa posta deklaracji zmiennej wyglda nastpujco.

 
 
 
 %%%

Element  to jeden z typw prostych, nazwa klasy lub interfejsu. (Klasy i interfejsy
zostan dokadniej omwione w kolejnych rozdziaach tej czci ksiki). Element 
 
 to nazwa zmiennej. Inicjalizacji zmiennej dokonuje si, uywajc znaku rwnoci i podajc   . Pamitaj, e wyraenie inicjalizacji musi powodowa powstanie
wartoci takiego samego (lub zgodnego) typu jak tworzona zmienna. Aby zadeklarowa kilka zmiennych, uywa si listy oddzielanej przecinkami.
Oto kilka przykadw deklaracji zmiennych rnych typw. Zauwa, e niektre s
inicjalizowane.
deklaruje trzy zmienne cakowite a, b i c
642deklaruje trzy zmienne cakowite, inicjalizuje d i f

 -##deklaruje i inicjalizuje z

 
6%$23deklaruje aproksymacj liczby pi
 C:C:zmienna x ma warto 'x'

Identyfikatory w swoich nazwach nie zawieraj adnych informacji na temat tego, jakiego s typu. W Javie kada poprawna nazwa identyfikatora moe zosta przypisana do
dowolnego typu.

Inicjalizacja dynamiczna
Cho poprzednie przykady uyway staych do inicjalizacji, Java umoliwia inicjalizacj dynamiczn wyraeniami poprawnymi w momencie deklaracji zmiennej.
Poniej znajduje si prosty program, ktry oblicza dugo przeciwprostoktnej trjkta prostoktnego na podstawie dugoci dwch przyprostoktnych.
Przykad inicjalizacji dynamicznej.
9E


  

  

 6%!$%!
c jest inicjalizowane dynamicznie

 F %G")"
%&%
'7-
+/H+*>')
1
1

W programie pojawia si deklaracja trzech zmiennych lokalnych ,  i . Dwie


pierwsze s inicjalizowane staymi, ale zmienna c jest inicjalizowana dynamicznie na
dugo przeciwprostoktnej (przy uyciu twierdzenia Pitagorasa). Poza tym program
wykorzystuje wbudowan metod jzyka Java o nazwie 
, bdc skadow klasy

Cz I Jzyk Java

74

. . Metoda zwraca pierwiastek kwadratowy z przekazanego argumentu. Dziki przykadowemu programowi atwo stwierdzi, e inicjalizacja dynamiczna moe wykorzysta dowolne elementy poprawne w momencie wykonywania inicjalizacji, wczajc
w to wywoania metod, wykorzystanie innych zmiennych lub staych.

Zasig i czas ycia zmiennych


Do tej pory wszystkie zmienne byy deklarowane na pocztku metody /. Tak
naprawd Java dopuszcza deklarowanie zmiennych w dowolnym bloku. W rozdziale
2. zdefiniowaem blok jako fragment kodu zaczynajcy si od otwierajcego nawiasu
klamrowego, a koczcy na zamykajcym nawiasie klamrowym. Blok definiuje zasig,
czyli rozpoczcie nowego bloku to utworzenie nowego zasigu. Zasig okrela, ktre
obiekty s widziane przez inne czci programu. Dodatkowo okrela czas ycia obiektw.
Wiele innych jzykw programowania definiuje dwa rodzaje zasigw: lokalny i globalny. Niestety, te tradycyjne zasigi nie pasuj najlepiej do cisego, obiektowego
modelu stosowanego przez Jav. Cho moliwe jest wykonanie czego na ksztat zasigu
globalnego, to jest to raczej wyjtek anieli regua. W Javie wystpuje inny podzia
zasigw: na te zdefiniowane przez klas i te zdefiniowane przez metod. W zasadzie
podzia ten jest nieco sztuczny. Poniewa jednak zasig klasy posiada pewne unikatowe
waciwoci i atrybuty, ktre nie maj zastosowania w zasigu metody, takie rozrnienie ma sens. Z powodu tych rnic omwienie zasigu klasy (i zadeklarowanych w nim
zmiennych) odkadam a do rozdziau 6., w ktrym dokadniej zostan opisane klasy.
Na razie skupi si na zasigu zwizanym z metodami.
Zasig definiowany przez metod rozpoczyna si od otwierajcego nawiasu klamrowego. Jeli metoda posiada parametry, nale one do zasigu metody. Poniewa dokadne omwienie parametrw znajduje si dopiero w rozdziale 5., tutaj wspomn tylko,
e parametry dziaaj dokadnie tak samo jak inne zmienne metody.
Oglnie zmienne zadeklarowane wewntrz zasigu nie s widziane (czyli dostpne)
przez kod znajdujcy si poza danym zasigiem. Z tego powodu zadeklarowanie zmiennej wewntrz zasigu powoduje przypisanie jej do konkretnego miejsca, a take chroni
j przez niepowoanym dostpem i modyfikacj. Waciwie zasady zwizane z zasigiem s podstaw hermetyzacji.
Zasig mona zagnieda. Na przykad za kadym razem, gdy tworzy si blok kodu,
powstaje nowy, zagniedony zasig. W takiej sytuacji zasig zewntrzny zawiera zasig
wewntrzny. Innymi sowy, zmienne zadeklarowane w zasigu zewntrznym bd
widoczne w zasigu wewntrznym. Sytuacja odwrotna nie jest prawdziwa zmienne
zadeklarowane wewntrz zasigu wewntrznego nie s widoczne na zewntrz niego.
Aby lepiej zrozumie efekt zagniedania zasigw, rozwamy nastpujcy program.
Przykad zasigu bloku.


  

  
Cwidziany przez cay kod metody

Rozdzia 3. Typy danych, zmienne i tablice

75

C!
C! pocztek nowego zasigu
#!o tej zmiennej wie tylko ten blok
tutaj znana jest zarwno zmienna x, jak i y
%&%
'C
<')C)'')
C"#
1
y = 100; // Bd! Zmienna y nie jest znana.
nadal znamy warto zmiennej x
%&%
'C+
')C
1
1

Zgodnie z komentarzami, zmienna  jest deklarowana na pocztku metody / i jest


widziana przez cay jej kod. Wewntrz bloku dochodzi do deklaracji zmiennej 0.
Poniewa blok okrela zasig, zmienna jest widoczna tylko wewntrz bloku. Wanie
z tego powodu poza blokiem wiersz 01 2 zosta wyczony za pomoc komentarza. Jeli zostaby wczony, spowodowaby zgoszenie bdu w trakcie kompilacji,
poniewa 0 nie jest widoczne poza swoim blokiem. Wewntrz bloku mona korzysta ze zmiennej , gdy zostaa ona zdefiniowana w bloku zewntrznym, do ktrego
ma dostp blok wewntrzny.
Wewntrz bloku deklaracja zmiennej moe pojawi si w dowolnym wierszu, ale jest
poprawna dopiero po nim. Z tego powodu zadeklarowanie zmiennej na pocztku metody
powoduje, e jest ona dostpna dla caego kodu tej metody. Deklaracja zmiennej na
kocu bloku nie ma sensu, poniewa aden fragment kodu nie bdzie mia do niej dostpu. Poniszy fragment kodu nie jest poprawny, gdy zmienna  nie moe zosta
uyta przed jej zadeklarowaniem.
Ten fragment zawiera bd!
&!!Ojej! Nie mona uy zmiennej count zanim nie zostanie zadeklarowana!
&

Warto pamita o innej bardzo istotnej kwestii: zmienne s tworzone w momencie


wejcia w ich zasig i niszczone przy wychodzeniu z danego zasigu. Oznacza to, e
zmienna nie bdzie przechowywaa swojej wartoci, gdy znajdzie si poza zasigiem.
Wanie z tego powodu zmienne metody nie zachowuj swoich wartoci midzy kolejnymi wywoaniami metody. Podobna sytuacja dotyczy blokw zmienna utraci
swoj warto, gdy wyjdziemy z bloku. Innymi sowy, czas ycia zmiennej jest cile
zwizany z jej zasigiem.
Jeli deklaracja zmiennej zawiera inicjalizacj, zmienna ta zostanie ponownie zainicjalizowana przy kadym wejciu do bloku, do ktrego jest przypisana. Rozwamy nastpujcy program.
Przykad czasu ycia zmiennej.

4@


  

  
C
 C!CI6C))
Jy jest inicjalizowane przy kadej iteracji ptli

Cz I Jzyk Java

76

%&%
'+
')zawsze zostanie wywietlone 1
!!
%&%
'-+
')
1
1
1

Wykonanie programu spowoduje wywietlenie nastpujcego wyniku.


+
J
-+
!!
+
J
-+
!!
+
J
-+
!!

Jak atwo zauway, przy kadej nowej iteracji ptli  zmienna 0 jest ponownie inicjalizowana wartoci 1. Cho pniej zostaje jej przypisana warto 100, jest ona
tracona w kolejnej iteracji.
Ostatnia uwaga: cho bloki mog by zagniedane, nie mona zadeklarowa zmiennej
o takiej samej nazwie jak zmienna z bloku zewntrznego. Poniszego programu nie
uda si skompilowa.
Ten program si nie skompiluje.
K

  

  

  tworzy nowy zasig
#Bd kompilacji -- zmienna bar jest ju zadeklarowana!
1
1
1

Konwersja typw i rzutowanie


Jeli kto wczeniej pisa programy komputerowe, zapewne wie, e czsto zachodzi
potrzeba przypisania wartoci jednego typu do zmiennej innego typu. Jeli oba typy
s ze sob zgodne, Java dokona automatycznej konwersji. Na przykad zawsze mona
przypisa warto typu
 do zmiennej 
. Niestety, nie wszystkie typy s ze sob
zgodne i z tego powodu niejawna konwersja nie zawsze jest dozwolona. Na przykad
Java nie wykona automatycznej konwersji z typu   do typu . Na szczcie
nadal mona dokona takiej konwersji, ale trzeba to zrobi jawnie, uywajc tak zwanego
rzutowania typw. Przyjrzyjmy si teraz konwersji automatycznej oraz rzutowaniu.

Automatyczna konwersja typw


Gdy jeden typ danych jest przypisywany do zmiennej innego typu, automatyczna konwersja typu zostanie wykonana, jeli zostan spenione oba ponisze warunki:

Rozdzia 3. Typy danych, zmienne i tablice

77

 oba typy danych s zgodne,


 typ docelowy jest pojemniejszy (w sensie zakresu) od typu rdowego.

Po spenieniu obu warunkw dochodzi do tak zwanej konwersji rozszerzajcej. Na


przykad typ
 jest na tyle pojemny, e zawsze potrafi pomieci wszystkie wartoci
typu , wic Java nie wymaga jawnego rzutowania.
W przypadku konwersji rozszerzajcej, typy numeryczne (typy cakowite i zmiennoprzecinkowe) s ze sob zgodne. Z drugiej strony, typy numeryczne nie s zgodne z typami
 i  
. Dodatkowo, typy  i  
nie s zgodne midzy sob.
Wspomniano ju wczeniej, e Java dokonuje automatycznej konwersji literaw cakowitych do zmiennych typu ,  oraz 
.

Rzutowanie dla typw niezgodnych


Cho konwersja automatyczna jest pomocna, nie pokrywa wszelkich moliwych sytuacji. Na przykad zachodzi potrzeba konwersji z typu
 do typu . Nie dojdzie
w tej sytuacji do konwersji automatycznej, poniewa typ  jest mniejszy od typu

. Teki rodzaj konwersji jest czsto nazywany konwersj zawajc, gdy dokonuje jawnego ograniczenia wartoci rdowej do zakresu docelowego typu.
Aby dokona konwersji midzy dwoma niezgodnymi typami, trzeba uy rzutowania.
Rzutowanie to po prostu jawna konwersja typu. Jego oglna posta jest nastpujca.
  
 

Element    okrela typ, do ktrego ma zosta skonwertowana   .


Poniszy fragment kodu dokonuje konwersji z typu
 do typu . Jeli warto
w zmiennej  jest wiksza od dopuszczalnego zakresu typu , zostanie wykonana
operacja modulo (reszta z dzielenia liczby
 przez zakres nowego typu) ograniczajca
t warto do zakresu .


 
...

 

Inny rodzaj konwersji wystpi, gdy liczba zmiennoprzecinkowa bdzie konwertowana


do typu cakowitego wystpi wtedy tak zwane obcicie. Liczby cakowite nie maj
czci uamkowej. Z tego powodu przy opisanej konwersji tracona jest informacja na
temat uamka. Jeli na przykad przypiszemy warto 1,23 do typu cakowitego, uzyskamy warto 1. Uamek 0,23 zostanie obcity. Oczywicie, jeli oglna warto bdzie
za dua, aby zmieci si w docelowym typie, zostanie dodatkowo wykonana redukcja
modulo dla zakresu docelowego typu.
Poniszy program przedstawia kilka konwersji wymagajcych rzutowania.
Przykady rzutowania.
8L


Cz I Jzyk Java

78

  

  

 

#2M

 6#6%$#
%&%
'BN+D-
 %'

 

%&%
'
-')
)'')
%&%
'BN+D-
 %'


%&%
'-
'))'')

%&%
'BN+D-
 
 %'

 
%&%
'-'))'')
1
1

Wynik dziaania programu jest nastpujcy.


N+D-
 %

-#2M
N+D-
 %
-
6#6%$#6#6
N+D-
 
 %

6#6%$# M

Przyjrzyjmy si poszczeglnym konwersjom. Gdy warto 257 jest rzutowana do typu


, wynikiem jest reszta z dzielenia 257 przez 256 (zakres typu ), czyli warto 1.
Gdy zmienn d konwertujemy do typu
, tracimy cz uamkow. Gdy zmienn
d konwertujemy do typu , tracimy cz uamkow oraz dodatkowo dochodzi do
redukcji modulo 256, co powoduje uzyskanie wartoci 67.

Automatyczne rozszerzanie typw


w wyraeniach
Poza przypisaniami, istnieje jeszcze inne miejsce, w ktrym moe doj do konwersji
typw: w wyraeniach. Rozwamy nastpujc sytuacj. W wyraeniu precyzja wymagana w obliczeniach porednich wykracza poza zakres operandw. Oto przykad
takiej sytuacji.

 $!

 2!

 !!
"

Wynik wykonania dziaania 3 z pewnoci przekroczy dopuszczalny rozmiar operandw typu . Z tego powodu Java automatycznie rozszerza (promuje) w wyraeniu kady operand typu  lub  do typu
. Oznacza to, e obliczenie dziaania
 3  jest wykonywane dla typu
, zamiast dla typu . Wynik wyraenia poredniego, 2000, jest wic poprawny, cho zmienne  i  s typu .

Rozdzia 3. Typy danych, zmienne i tablice

79

Cho automatyczne rozszerzanie typw jest pomocne, czasem powoduje tajemnicze


bdy kompilacji. Na przykad poniszy kod, ktry wydaje si poprawny, nie daje si
skompilowa.

 2!
"#Bd! Niemoliwe przypisanie wartoci typu int do byte!

Kod prbuje przypisa warto wyniku mnoenia 502, czyli cakowicie poprawn liczb
typu , z powrotem do zmiennej typu . Poniewa jednak operandy zostay automatycznie rozszerzone do typu
, wynik wyraenia take jest typu
. Zgodnie
z wczeniejszymi zasadami, nie mona automatycznie przypisa typu
 do zmiennej
typu , nawet jeli wynik caej operacji mieci si w zakresie docelowego typu.
W przypadku, gdy w peni rozumie si konsekwencje przepenienia, mona wykorzysta jawne rzutowanie.

 2!

 "#

Spowoduje to poprawne przypisanie wartoci 100 do zmiennej .

Zasady rozszerzania typu


Poza wspomnianym wczeniej przypadkiem rozszerzania typw  i  do typu

, Java definiuje kilka zasad rozszerzania typw stosowanych w wyraeniach. Oto te
zasady. Po pierwsze, wszystkie wartoci typu  lub  s rozszerzane do typu

(wczeniejszy przykad). Po drugie, jeli ktrykolwiek z operandw jest typu 
,
cae wyraenie jest rozszerzane do tego typu. Po trzecie, jeli ktrykolwiek z operandw
jest typu , cae wyraenie jest rozszerzane do tego typu. Po czwarte, jeli ktrykolwiek z operandw jest typu  , wynikiem wykonania wyraenia jest typ  .
Poniszy program obrazuje to, w jaki sposb kada z wartoci wyraenia jest rozszerzana w celu dopasowania si do zakresu pozostaych argumentw.
7

  

  

 $#
  ::
 !#$

2!!!!
42% M4

 %#6$

 &4")
J"
%&%
4")')')
)'J')"
%&%
'+
/')&
1
1

Przyjrzyjmy si bliej rozszerzaniu typw wystpujcym w poniszym wierszu programu.



 &4")
J"

Cz I Jzyk Java

80

W pierwszym podwyraeniu,  3,  zostaje rozszerzone do typu , wic cae


podwyraenie jest typu . W nastpnym podwyraeniu, 4,  zostaje rozszerzone do typu
, wic cae podwyraenie jest typu
. W kolejnym podwyraeniu,
*3,  zostaje rozszerzone do typu  , wic cae podwyraenie jest typu  .
Nastpnie rozwaane s trzy wartoci porednie typw ,
 oraz  . Wynikiem dodania typu  do typu
 jest . Na kocu wynikiem odejmowania typu
  od typu  jest rozszerzenie do typu  , co w efekcie powoduje zwrcenie caego wyraenia typu  .

Tablice
Tablica to zbir zmiennych tego samego typu, do ktrych odwoujemy si przy uyciu
wsplnej nazwy. Mona tworzy tablice dowolnego typu o jednym lub wielu wymiarach. Konkretny element tablicy jest dostpny poprzez swj indeks. Tablice na og
su do grupowania powizanych ze sob informacji.
Jeeli dobrze zna si jzyk C lub C++ naley uwaa, poniewa w Javie tablice
dziaaj inaczej ni we wczeniej wymienionych jzykach.

Tablice jednowymiarowe
Tablica jednowymiarowa to po prostu lista zmiennych tego samego typu. Aby utworzy tablic, trzeba najpierw zadeklarowa zmienn tablicow odpowiedniego typu.
Oglna posta deklaracji tablicy jednowymiarowej jest nastpujca.




Element  okrela typ bazowy tablicy, czyli typ poszczeglnych elementw przechowywanych w tablicy. Innymi sowy, typ bazowy okrela, jakiego rodzaju dane bd
mogy by przechowywane w tablicy. Ponisza deklaracja tablicy o nazwie / 5*0
bdzie przechowywa liczby cakowite typu
.
 O

Cho deklaracja okrela, e nazwa / 5*0 oznacza zmienn tablicow, tak naprawd nie powstaa jeszcze adna tablica. Java ustawi warto zmiennej / 5*0
na warto , co oznacza, e tablica niczego nie przechowuje. Aby poczy /6
5*0 z rzeczywist tablic liczb cakowitych, trzeba j najpierw zaalokowa za pomoc operatora
. Operator ten powoduje alokacj odpowiedniej iloci pamici.
Operator
 zostanie dokadniej omwiony w kolejnych rozdziaach. Na razie wystarczy wiedzie jedynie, i alokuje on pami dla tablic. Poniej znajduje si oglna posta wykorzystania operatora do utworzenia tablicy jednowymiarowej.


  


Rozdzia 3. Typy danych, zmienne i tablice

81

Element  oznacza typ danych, dla ktrych powstaje tablica. Element  okrela
liczb elementw tablicy, a element    to nazwa zadeklarowanej wczeniej zmiennej tablicowej. Wynika z tego, e do alokacji tablicy potrzebna jest informacja na temat typu i liczby elementw, ktre maj si w niej znale. Elementy tablicy
alokowane operatorem
 s automatycznie zerowane. Poniszy kod alokuje 12-elementow tablic liczb cakowitych i przypisuje j do zmiennej / 5*0.
 O #

Po wykonaniu tej instrukcji zmienna / 5*0 odnosi si do tablicy 12 liczb cakowitych. Co wicej, wszystkie elementy tablicy przyjy warto 0.
Podsumujmy: utworzenie tablicy jest procesem dwuetapowym. Najpierw deklaruje si
zmienn odpowiedniego typu tablicowego. Nastpnie alokuje si za pomoc operatora

 pami, ktra bdzie przechowywaa elementy tablicy, po czym przypisuje si j


do zmiennej tablicowej. Wynika z tego, e w Javie wszystkie tablice s alokowane
dynamicznie. Jeli koncepcja alokacji dynamicznej nic Czytelnikowi nie mwi, nie naley si przejmowa, poniewa zostanie ona opisana dokadniej w dalszej czci ksiki.
Po zaalokowaniu tablicy do jej poszczeglnych elementw odwoujemy si, podajc
indeks elementu zawarty w nawiasach kwadratowych. Indeksy wszystkich tablic rozpoczynaj si od 0. Poniszy kod przypisuje warto 28 drugiemu elementowi tablicy
/ 5*0.
 O#

Poniszy kod spowoduje wywietlenie wartoci przechowywanej w elemencie o indeksie 3.


%&%
 O6

Po zoeniu wszystkich czci otrzymujemy program, ktry tworzy tablic liczby dni
w kadym z miesicy.
Przykad tablicy jednowymiarowej.
5

  

  
 O
 O #
 O!6
 O#
 O#6
 O66!
 O$6
 O26!
 O 6
 OM6
 O6!
 O36
 O!6!
 O6
%&%
'N+

P') O6)'
%'
1
1

Cz I Jzyk Java

82

Uruchomienie programu spowoduje wywietlenie liczby dni w miesicu kwietniu. Jak


wspomniano, indeksy tablic w Javie zaczynaj si od zera, wic liczb dni dla kwietnia
odczytujemy jako / 5*078.
Mona poczy deklaracj zmiennej tablicowej z alokacj pamici. Oto przykad.
 O #

Na og w profesjonalnie napisanych programach stosuje si takie wanie rozwizanie.


Tablice mona inicjalizowa w momencie deklaracji. Sposb wykonania tego zadania
nie rni si znaczco od inicjalizacji typw prostych. Inicjalizacja tablicy polega na
podaniu listy wyrae oddzielonych przecinkami, zawartej wewntrz nawiasw klamrowych. Przecinki rozdzielaj wartoci poszczeglnych elementw tablicy. Zostanie
automatycznie utworzona tablica na tyle dua, aby pomiecia wszystkie przekazane
elementy. Nie trzeba w takiej sytuacji stosowa operatora
. Poniej znajduje si zmodyfikowana wersja poprzedniego przykadu. Tym razem jednak do okrelenia liczby
dni w miesicach stosuje inicjalizacj tablicy.
Ulepszona wersja poprzedniego programu.
5&5

  

  
 O 6#66!66!666!66!61
%&%
'N+

P') O6)'
%'
1
1

Po uruchomieniu programu pojawi si dokadnie taki sam komunikat jak dla poprzedniego przykadu.
Java zawsze sprawdza, czy nie prbuje si zapisa lub odczyta wartoci spoza zakresu
tablicy. Innymi sowy, system wykonawczy Javy sprawdza, czy wszystkie stosowane
indeksy znajduj si w poprawnym zakresie. Na przykad przy kadym odwoaniu do
elementu tablicy / 5*0 maszyna wirtualna sprawdzi, czy indeks to warto z zakresu od 0 do 11. Gdy zostanie przekazana warto spoza zakresu (liczba ujemna lub
powyej dugoci tablicy), program zgosi bd wykonania.
Kolejny program w nieco bardziej zaawansowany sposb korzysta z tablicy jednowymiarowej, poniewa oblicza redni z kilku wartoci.
rednia wartoci znajdujcych si w tablicy.
5L 

  

  

 & !%%##%66%$$%21

 &!


 
!
I2
))
&&)&

%&%
'Q
+
')&2
1
1

Rozdzia 3. Typy danych, zmienne i tablice

83

Tablice wielowymiarowe
W Javie tablice wielowymiarowe s tak naprawd tablicami tablic. Dziaaj one dokadnie tak samo jak rzeczywiste tablice wielowymiarowe, cho wystpuje kilka subtelnych rnic. W celu zadeklarowania tablicy wielowymiarowej naley doda dodatkowe
indeksy, uywajc kolejnych par nawiasw kwadratowych. Poniszy przykad deklaruje tablic dwuwymiarow o nazwie 9).
+9 $2

Tablica ma rozmiar 4 na 5. Wewntrznie macierz jest implementowana jako tablica


tablic typu
. Koncepcyjnie wyglda ona mniej wicej tak, jak na rysunku 3.1.
Rysunek 3.1.
Widok koncepcyjny
tablicy dwuwymiarowej
o wymiarach 4 na 5

Poniszy program numeruje poszczeglne elementy tablicy, posuwajc si od lewej


do prawej i z gry na d. Nastpnie wywietla te wartoci.
// Przykad tablicy dwuwymiarowej.
@+95

  

  
+9 $2

D/!
 
!
I$
))
 D!DI2D))
+9
D/
/))
1
 
!
I$
))
 D!DI2D))
%&%
+9
D)''
%&%

1
1
1

Cz I Jzyk Java

84

Wykonanie programu powoduje uzyskanie nastpujcego wyjcia.


!#6$
2 M3
!#6$
2 M3

Gdy alokuje si pami dla tablicy wielowymiarowej, obowizkowe jest podanie tylko
pierwszego (najbardziej lewego) wymiaru. Pozostae wymiary mona deklarowa osobno.
Poniszy kod tworzy dokadnie t sam dwuwymiarow tablic co wczeniej, ale drugi
wymiar jest ustalany rcznie.
+9 $
+9! 2
+9 2
+9# 2
+96 2

Cho w tej sytuacji sposb rcznej alokacji tablicy nie ma adnej przewagi nad alokacj
automatyczn, s sytuacje, w ktrych warto go stosowa. Przykadem moe by sytuacja, w ktrej poszczeglne wymiary maj posiada rn liczb elementw. Poniewa tablica wielowymiarowa jest tak naprawd tablic tablic, mamy pen swobod
w dobieraniu rozmiarw podtablic. Poniszy program obrazuje, w jaki sposb wykona
dwuwymiarow tablic, w ktrej liczba elementw w drugim wymiarze zmienia si.
Rczna alokacja rnych rozmiarw dla drugiego wymiaru.
@+95 


  

  
+9 $
+9! 
+9 #
+9# 6
+96 $

D/!
 
!
I$
))
 D!DI
)D))
+9
D/
/))
1
 
!
I$
))
 D!DI
)D))
%&%
+9
D)''
%&%

1
1
1

Wykonanie programu powoduje uzyskanie nastpujcego wyjcia.


!
#
6$2
M3

Rysunek 3.2 przedstawia tablic utworzon przez program.

Rozdzia 3. Typy danych, zmienne i tablice

85

Rysunek 3.2.
Dwuwymiarowa
tablica z rnym
rozmiarem
drugiego wymiaru

Wykorzystanie nieregularnych tablic wielowymiarowych w wielu zastosowaniach nie


jest podane, poniewa ludzie na og oczekuj symetrycznoci takiej tablicy. Z drugiej strony s sytuacje, w ktrych nieregularno zwiksza wydajno. Przykadem
moe by algorytm, ktry potrzebuje bardzo duej tablicy dwuwymiarowej, ale zapenia
tylko niewielki jej fragment.
Tablice wielowymiarowe take mona inicjalizowa. W tym celu inicjalizacj kadego
z wymiarw trzeba zawrze wewntrz wasnego zestawu nawiasw klamrowych. Poniszy przykadowy program tworzy macierz, w ktrej kady element zawiera warto mnoenia indeksu wiersza i kolumny. Zauwa, e przy inicjalizacji tablicy mona
stosowa nie tylko literay, ale rwnie wyraenia.
Inicjalizacja tablicy wielowymiarowej.
F
C

  

  

 
 !"!"!#"!6"!1
 !""#"6"1
 !"#"##"#6"#1
 !"6"6#"66"61
1

D
 
!
I$
))
 D!DI$D))
%&%

D)''
%&%

1
1
1

Wyniki dziaania programu s nastpujce.


!%!!%!!%!!%!
!%!%!#%!6%!
!%!#%!$%! %!
!%!6%! %!3%!

Jak atwo zauway, kady element zosta zainicjalizowany zgodnie z list inicjalizacji.
Przyjrzyjmy si bardziej zoonemu przykadowi, ktry wykorzystuje tablic wielowymiarow. Kolejny program tworzy tablic trjwymiarow 3 na 4 na 5. Nastpnie zapenia elementy wartociami mnoenia ich indeksw. Na kocu wywietla obliczone
wartoci.

Cz I Jzyk Java

86
Przykad tablicy trjwymiarowej.
@ 9F
C

  

  
 9 6$2

D/
 
!
I6
))
 D!DI$D))
 /!/I2/))
 9
D/
"D"/
 
!
I6
))
 D!DI$D))
 /!/I2/))
%&%
 9
D/)''
%&%

1
%&%

1
1
1

Wyniki dziaania programu s nastpujce.


!!!!!
!!!!!
!!!!!
!!!!!
!!!!!
!#6$
!#$ 
!6 3#
!!!!!
!#$ 
!$#
! ##$

Alternatywna skadnia deklaracji tablicy


Java obsuguje alternatywn posta deklaracji tablicy.




W tej postaci nawiasy kwadratowe pojawiaj si po nazwie typu zamiast po nazwie


zmiennej. Dwie ponisze deklaracje s sobie rwnowane.
 6
# 6

Ponisze deklaracje rwnie s sobie rwnowane.


 +   6$
 +   6$

Rozdzia 3. Typy danych, zmienne i tablice

87

Alternatywna posta deklaracji przydaje si przede wszystkim wtedy, gdy w jednym


wierszu deklaruje si wiele tablic. Oto przykad.
&&#&6powstaj trzy tablice

W ten sposb powstaj trzy tablice typu


. Gdyby zastosowa podstawow posta
deklaracji, trzeba by napisa nastpujcy wiersz.
&&#&6powstaj trzy tablice

Dodatkowo, posta alternatywna przydaje si take wtedy, gdy tablica ma by typem


zwracanym przez metod. W ksice obie skadnie pojawiaj si zamiennie.

Kilka sw na temat cigw znakw


W poprzednich opisach zwizanych z typami danych oraz tablicami praktycznie nie
pojawiay si adne informacje na temat cigw znakw i zwizanych z nimi typw.
Nie oznacza to, e Java nie obsuguje cigw znakw wrcz przeciwnie. Istnieje w Javie
typ tekstowy o nazwie :
;, ale nie jest on typem prostym ani tablic znakw. Typ
:
; to klasa, wic jej peny opis wymaga dobrej znajomoci elementw obiektowych
dostpnych w Javie. Z tego powodu zostanie opisana dopiero po dokadnym omwieniu
obiektowoci. Poniewa jednak proste teksty pojawiaj si w wielu przykadowych
programach, oto krtkie wyjanienie.
Typ :
; suy do deklarowania cigw znakw. Oczywicie mona rwnie deklarowa tablice cigw znakw. Do zmiennej typu :
; mona przypisa dowolny tekst
ujty w cudzysowy lub te przypisa zawarto jednej zmiennej typu :
; do innej
zmiennej tego samego typu. Metoda <
  jako argumenty przyjmuje obiekty typu
:
;. Rozwamy nastpujcy fragment kodu.

 'D'
%&%


W tym przykadzie 
to obiekt typu :
;, ktremu zosta przypisany tekst to jest
test. Tekst zostaje wywietlony za pomoc instrukcji <
 .
Obiekty :
; posiadaj wiele cech i atrybutw, ktre czyni je bardzo elastycznymi
i atwymi w uyciu. Jednak w kilku kolejnych rozdziaach bdziemy korzysta tylko
z ich najprostszej postaci.

Uwaga dla programistw jzyka C


lub C++ na temat wskanikw
Jeli jest si dowiadczonym programist jzyka C lub C++, z pewnoci wielokrotnie stosowao si w nim wskaniki. W tym rozdziale do tej pory ani razu nie pado
sowo wskanik. Powd jest bardzo prosty: Java po prostu nie obsuguje wskanikw.

88

Cz I Jzyk Java

(W zasadzie to nie obsuguje wskanikw, ktre mogyby by modyfikowane lub odczytywane przez programist). Java nie moe sobie pozwoli na udostpnienie wskanikw, gdy takie rozwizanie zamaoby cian dzielc rodowisko wykonawcze Javy
od systemu operacyjnego komputera. (Pamitaj, e wskanik moe przyj dowolny
adres nawet taki, ktry znajduje si poza systemem wykonawczym Javy). Poniewa
jzyki C i C++ intensywnie korzystaj ze wskanikw, moe si wydawa, i ich brak
w jzyku Java jest znaczcym ograniczeniem. Na szczcie nie jest to prawda. Java
zostaa tak zaprojektowana, e wskaniki w ogle nie s potrzebne, jeli pozostaje si
wewntrz rodowiska wykonawczego.

You might also like