Professional Documents
Culture Documents
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
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
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 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
Spis treci
Cze II
10
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
12
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
14
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
16
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
18
Spis treci
19
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
Rozdzia 3.
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
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
65
Rozmiar
Zakres
64
od 9 223 372 036 854 775 808 do 9 223 372 036 854 775 807
32
16
od 32 768 do 32 767
od 128 do 127
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
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
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.
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.
89#
:=:
%&%
'-+
-/')
))inkrementacja ch1
%&%
'-+*>')
1
1
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
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 .
71
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
B&CCCC
B:
Apostrof
B'
Cudzysw
BB
Lewy ukonik
B
Powrt karetki
B
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.
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
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.
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
Cz I Jzyk Java
76
%&%
'+
')zawsze zostanie wywietlone 1
!!
%&%
'-+
')
1
1
1
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
77
...
Cz I Jzyk Java
78
#2M
6#6%$#
%&%
'BN+D-
%'
%&%
'
-')
)'')
%&%
'BN+D-
%'
%&%
'-
'))'')
%&%
'BN+D-
%'
%&%
'-'))'')
1
1
-#2M
N+D-
%
-
6#6%$#6#6
N+D-
%
6#6%$# M
$!
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 .
79
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!
"#
Cz I Jzyk Java
80
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.
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
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
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
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
Cz I Jzyk Java
84
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
+92
+9#2
+962
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
85
Rysunek 3.2.
Dwuwymiarowa
tablica z rnym
rozmiarem
drugiego wymiaru
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
96$2
D/
!
I6
))
D!DI$D))
/!/I2/))
9
D/
"D"/
!
I6
))
D!DI$D))
/!/I2/))
%&%
9
D/)''
%&%
1
%&%
1
1
1
87
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.
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.