Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
Java. wiczenia
praktyczne. Wydanie II
Autor: Marcin Lis
ISBN: 83-246-0327-1
Format: B5, stron: 192
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
Programowanie w Javie
Rozdzia 1. Krtkie wprowadzenie
Instalacja JDK
Pierwszy program
B-kod, kompilacja i maszyna wirtualna
Java a C++
Obiektowy jzyk programowania
Struktura programu
Rozdzia 4. Wyjtki
Bdy w programach
Instrukcja try...catch
Zgaszanie wyjtkw
Hierarchia wyjtkw
5
9
9
12
13
14
15
16
17
17
26
37
51
53
59
62
66
71
71
75
77
79
Rozdzia 5. Rysowanie
Aplikacja a aplet
Pierwszy aplet
Jak to dziaa?
Cykl ycia apletu
Czcionki
Rysowanie grafiki
Kolory
Wywietlanie obrazw
81
81
82
84
86
86
89
95
98
Rozdzia 6. Dwiki
103
Rozdzia 7. Animacje
107
Pywajcy napis
Pywajcy napis z buforowaniem
Zegar cyfrowy
Animacja poklatkowa
Zegar analogowy
107
112
114
116
118
123
123
126
130
131
137
137
139
146
151
151
152
169
169
176
Typy podstawowe
Typy podstawowe dziel si na:
q typy cakowitoliczbowe (z ang. integral types),
q typy zmiennopozycyjne (rzeczywiste, z ang. floating-point types),
q typ boolean,
q typ char.
18
Typy cakowitoliczbowe
Rodzina typw cakowitoliczbowych skada si z czterech typw:
q byte,
q short,
q int,
q long.
W przeciwiestwie do C++ dokadnie okrelono sposb reprezentacji
tych danych. Niezalenie wic od tego, na jakim systemie pracujemy
(16-, 32- czy 64-bitowym), dokadnie wiadomo, na ilu bitach zapisana jest zmienna danego typu. Wiadomo te dokadnie, z jakiego zakresu wartoci moe ona przyjmowa, nie ma wic dowolnoci, ktra
w przypadku jzyka C moga prowadzi do sporych trudnoci przy
przenoszeniu programw pomidzy rnymi platformami. W tabeli 2.1
zaprezentowano zakresy poszczeglnych typw danych oraz liczb
bitw niezbdn do zapisania zmiennych danego typu.
Tabela 2.1. Zakresy typw arytmetycznych w Javie
Typ
Liczba bitw
Liczba bajtw
Zakres
byte
od 128 do 127
short
16
od 32 768 do 32 767
int
32
long
64
Typy zmiennoprzecinkowe
Typy zmiennoprzecinkowe wystpuj tylko w dwch odmianach:
q float (pojedynczej precyzji),
q double (podwjnej precyzji).
Zakres oraz liczb bitw i bajtw potrzebnych do zapisu tych zmiennych prezentuje tabela 2.2.
19
Liczba bitw
Liczba bajtw
Zakres
float
32
od 3,4e38 do 3,4e38
double
64
od 1,8e308 do 1,8e308
Typ boolean
Jest to typ logiczny. Moe on reprezentowa jedynie dwie wartoci:
true (prawda) i false (fasz). Moe by wykorzystywany przy sprawdzaniu rnych warunkw w instrukcjach if, a take w ptlach i innych konstrukcjach programistycznych, ktre zostan przedstawione
w dalszej czci rozdziau.
Typ char
Typ char suy do reprezentacji znakw (liter, znakw przestankowych,
oglnie wszelkich znakw alfanumerycznych), przy czym w Javie
jest on 16-bitowy i zawiera znaki Unicode. Poniewa znaki reprezentowane s tak naprawd jako 16-bitowe kody liczbowe, typ ten zalicza si czasem do typw arytmetycznych.
20
W I C Z E N I E
2.1.
Deklarowanie zmiennych
public
class Main
{
public static void main (String args[])
{
int pierwszaLiczba;
int drugaLiczba;
pierwszaLiczba = 10;
drugaLiczba = 20;
System.out.println ("pierwsza liczba: " + pierwszaLiczba);
System.out.println ("druga liczba: " + drugaLiczba);
}
}
Mona rwnie zadeklarowa wiele zmiennych danego typu, oddzielajc ich nazwy przecinkami. Cz z nich moe by te od razu zainicjowana:
typ_zmiennej nazwa1, nazwa2, nazwa3;
typ_zmiennej nazwa1 = warto1, nazwa2, nazwa3 = warto2;
Zmienne w Javie, podobnie jak w C czy C++, ale inaczej ni w Pascalu, mona deklarowa wedle potrzeb wewntrz funkcji czy metody.
21
W I C Z E N I E
2.2.
Zadeklaruj i jednoczenie zainicjalizuj dwie zmienne typu cakowitego. Wynik wywietl na ekranie.
public
class Main
{
public static void main (String args[])
{
int pierwszaLiczba = 10;
int drugaLiczba = 20;
System.out.println ("pierwsza liczba: " + pierwszaLiczba);
System.out.println ("druga liczba: " + drugaLiczba);
}
}
W I C Z E N I E
2.3.
22
Typy odnonikowe
Typy odnonikowe (ang. reference types) moemy podzieli na dwa
umowne rodzaje:
q typy klasowe (ang. class types)1,
q typy tablicowe (ang. array types).
Zacznijmy od typw tablicowych. Tablice s to wektory elementw
danego typu i su do uporzdkowanego przechowywania wartoci
tego typu. Mog by jedno- bd wielowymiarowe. Dostp do danego
elementu tablicy jest realizowany poprzez podanie jego indeksu,
czyli miejsca w tablicy, w ktrym si on znajduje. Dla tablicy jednowymiarowej bdzie to po prostu kolejny numer elementu, dla tablicy
dwuwymiarowej trzeba ju poda numer wiersza i kolumny itd. Jeli
chcemy zatem przechowa w programie 10 liczb cakowitych, najwygodniej bdzie uy w tym celu 10-elementowej tablicy typu int.
Typy klasowe pozwalaj na tworzenie klas i deklarowanie zmiennych
obiektowych. Zajmiemy si nimi w rozdziale 3.
lub:
typ_zmiennej nazwa_zmiennej_1, nazwa_zmiennej_2, nazwa_zmiennej_3;
Stosujc taki zapis, inaczej ni w przypadku typw prostych, zadeklarowalimy jednak jedynie tzw. odniesienie (ang. reference) do obiektu, a nie sam byt, jakim jest obiekt! Takiemu odniesieniu domylnie
1
23
bdziemy mieli gotow do uycia zmienn typu cakowitego. Moemy jej przypisa np. warto 10. eby jednak mc skorzysta z tablicy, musimy zadeklarowa zmienn odnonikow typu tablicowego,
utworzy obiekt tablicy i powiza go ze zmienn. Dopiero wtedy
bdziemy mogli swobodnie odwoywa si do kolejnych elementw.
Piszc zatem:
int tablica[];
2.4.
Deklarowanie tablicy
Ju przy prbie kompilacji kompilator wypisze na ekranie tekst: Variable tablica might not have been initialized, informujcy nas,
e chcemy odwoa si do zmiennej, ktra prawdopodobnie nie zostaa zainicjalizowana (rysunek 2.2). Widzimy te wyranie, e w razie wystpienia bdu na etapie kompilacji otrzymujemy kilka wanych i pomocnych informacji. Przede wszystkim jest to nazwa pliku,
w ktrym wystpi bd (jest to wane, gdy program moe skada
si z bardzo wielu klas, a kada z nich jest zazwyczaj definiowana
w oddzielnym pliku), numer wiersza w tym pliku oraz konkretne
24
2.5.
Wyraenie new tablica[10] oznacza utworzenie nowej, jednowymiarowej tablicy liczb typu int o rozmiarze 10 elementw. Ta nowa
tablica zostaa przypisana zmiennej odnonikowej o nazwie tablica.
Po takim przypisaniu moemy odwoywa si do kolejnych elementw
tej tablicy, piszc:
tablica[index]
25
W I C Z E N I E
2.6.
Zadeklaruj i zainicjalizuj tablic dziesicioelementow. Sprbuj przypisa elementowi o indeksie 10 dowoln liczb cakowit.
public
class Main
{
public static void main (String args[])
{
int tablica[] = new int[10];
tablica[10] = 11;
System.out.println ("Dziesity element tablicy to: "
+ tablica[10]);
}
}
26
Poznalimy ju zmienne, musimy jednak wiedzie, jakie operacje moemy na nich wykonywa. Operacje wykonujemy za pomoc rnych
operatorw, np. odejmowania, dodawania, przypisania itd. Operatory te
moemy podzieli na nastpujce grupy2:
q arytmetyczne,
q bitowe,
q logiczne,
q przypisania,
q porwnania.
Operatory arytmetyczne
Wrd tych operatorw znajdziemy standardowo dziaajce:
q + dodawanie,
q odejmowanie,
q * mnoenie,
q / dzielenie.
W I C Z E N I E
2.7.
27
2.8.
Dzielenie modulo
28
W I C Z E N I E
2.9.
Operator inkrementacji
2.10.
Operator dekrementacji
29
otrzymany wynik jest taki sam, jak otrzymany na ekranie po uruchomieniu kodu.
public
class Main
{
public static void main (String args[])
{
/*1*/ int x = 1, y;
/*2*/ System.out.println (--x);
/*3*/ System.out.println (x--);
/*4*/ System.out.println (x);
/*5*/ y = x--;
/*6*/ System.out.println (y);
/*7*/ y = --x;
/*8*/ System.out.println (--y);
}
}
2.11.
30
W I C Z E N I E
2.12.
Zadeklaruj zmienn typu byte. Przypisz jej warto 128. Sprbuj dokona kompilacji otrzymanego kodu.
public
class Main
{
public static void main (String args[])
{
byte zmienna;
zmienna = 128;
System.out.println(zmienna);
}
}
2.13.
Zadeklaruj zmienne typu long. Wykonaj operacje arytmetyczne przekraczajce dopuszczaln warto takiej zmiennej. Wynik wywietl na
ekranie.
31
public
class Main
{
public static void main (String args[])
{
long a, b = (long) Math.pow(2, 63) + 1;
a = b + b;
System.out.println ("a = " + a);
}
}
Operatory bitowe
Operacje te, jak sama nazwa wskazuje, dokonywane s na bitach.
Przypomnijmy zatem podstawowe wiadomoci o systemach liczbowych. W systemie dziesitnym, z ktrego korzystamy na co dzie,
wykorzystywanych jest dziesi cyfr od 0 do 9. W systemie dwjkowym bd zatem wykorzystywane jedynie dwie cyfry 0 i 1.
Kolejne liczby budowane s z tych dwch cyfr, dokadnie tak samo
jak w systemie dziesitnym; przedstawia to tabela 2.3. Wida wyranie, e np. 4 dziesitnie to 100 dwjkowo, a 10 dziesitnie to 1010
dwjkowo.
32
System dziesitny
10
11
100
101
110
111
1000
1001
1010
10
1011
11
1100
12
1101
13
1110
14
1111
15
Operatory logiczne
Argumentami operacji takiego typu musz by wyraenia posiadajce
warto logiczn, czyli true lub false (prawda i fasz). Przykadowo,
wyraenie 10 < 20 jest niewtpliwie prawdziwe (10 jest mniejsze od 20),
33
Symbol
AND
&
OR
NOT
XOR
>>
<<
>>>
zatem jego warto logiczna jest rwna true. W grupie tej wyrniamy trzy operatory:
q logiczne AND (&&),
q logiczne OR (||),
q logiczna negacja (!).
Warto zauway, e w czci przypadkw stosowania operacji logicznych, aby otrzyma wynik, wystarczy obliczy tylko pierwszy argument. Wynika to, oczywicie, z waciwoci operatorw. Jeli bowiem
wynikiem obliczenia pierwszego argumentu jest warto true, a wykonujemy operacj OR, to niezalenie od stanu drugiego argumentu
wartoci caego wyraenia bdzie true. Podobnie przy stosowaniu
operatora AND jeeli wartoci pierwszego argumentu bdzie false,
to i wartoci caego wyraenia bdzie false.
Operatory przypisania
Operacje przypisania s dwuargumentowe i powoduj przypisanie
wartoci argumentu znajdujcego si z prawej strony do argumentu
znajdujcego si z lewej strony. Najprostszym operatorem tego typu
jest oczywicie klasyczny znak rwnoci. Zapis liczba = 5 oznacza,
e zmiennej liczba chcemy przypisa warto 5. Oprcz tego mamy
jeszcze do dyspozycji operatory czce klasyczne przypisanie z innym operatorem arytmetycznym bd bitowym. Zostay one zebrane
w tabeli 2.5.
34
Operator
Argument 2
Znaczenie
x = y
+=
x = x + y
-=
x = x y
*=
x = x * y
/=
x = x / y
%=
x = x % y
<<=
x = x << y
>>=
x = x >> y
>>>=
x = x >>> y
&=
x = x & y
|=
x = x | y
^=
x = x ^ y
Operator warunkowy
Operator warunkowy ma nastpujc skadni:
warunek ? warto1 : warto2;
35
Opis
==
!=
>
<
>=
<=
W I C Z E N I E
2.14.
Wykorzystaj operator warunkowy do zmodyfikowania wartoci dowolnej zmiennej typu cakowitego (int).
public
class Main
{
public static void main (String args[])
{
int x = 1, y;
y = (x == 1 ? 10 : 20);
System.out.println ("y = " + y);
}
}
36
Priorytety operatorw
Sama znajomo operatorw to jednak nie wszystko. Niezbdna jest
jeszcze wiedza na temat tego, jaki maj one priorytet, czyli jaka jest
kolejno ich wykonywania. Wiadomo na przykad, e mnoenie jest
silniejsze od dodawania, zatem najpierw mnoymy, potem dodajemy. W Javie jest podobnie, sia kadego operatora jest cile okrelona. Przedstawia to tabela 2.73. Im wysza pozycja w tabeli, tym
wyszy priorytet operatora. Operatory znajdujce si na jednym poziomie (w jednym wierszu) maj ten sam priorytet.
Tabela 2.7. Priorytety operatorw w Javie
Grupa operatorw
Symbole
inkrementacja przyrostkowa
++, --
++, --, ~, !
mnoenie, dzielenie
*, /, %
przesunicia bitowe
porwnania
porwnania
==, !=
bitowe AND
&
bitowe XOR
bitowe OR
logiczne AND
&&
logiczne OR
||
warunkowe
przypisania
37
2.15.
38
Jeeli delta jest rwna zero, istnieje tylko jedno rozwizanie mianowicie x = B / (2 * A). W przypadku trzecim, jeeli delta jest
mniejsza od zera, rwnanie takie nie ma rozwiza w zbiorze liczb
rzeczywistych.
Skoro jest tutaj tyle warunkw do sprawdzenia, to jest to doskonay
przykad do potrenowania zastosowania instrukcji if...else. Aby
nie komplikowa zagadnienia, nie bdziemy si w tej chwili zajmowa wczytywaniem parametrw rwnania z klawiatury, ale podamy
je bezporednio w kodzie.
W I C Z E N I E
2.16.
Wykorzystaj operacje arytmetyczne oraz instrukcj if...else do obliczenia pierwiastkw rwnania kwadratowego o parametrach podanych bezporednio w kodzie programu.
public
class Main
{
public static void main (String args[])
{
int parametrA = 1, parametrB = -1, parametrC = -6;
System.out.println ("Parametry rwnania:\n");
System.out.println ("A: " + parametrA + " B: " + parametrB + " C: "
+ parametrC + "\n");
if (parametrA == 0){
System.out.println ("To nie jest rwnanie kwadratowe: A = 0!");
}
else{
double delta = parametrB * parametrB - 4 * parametrA * parametrC;
if (delta < 0){
System.out.println ("Delta < 0.");
System.out.println ("To rwnanie nie ma rozwizania w zbiorze
liczb rzeczywistych");
}
else{
double wynik;
if (delta == 0){
wynik = - parametrB / 2 * parametrA;
System.out.println ("Rozwizanie: x = " + wynik);
}
else{
wynik = (- parametrB + Math.sqrt(delta)) / 2 * parametrA;
System.out.print ("Rozwizanie: x1 = " + wynik);
wynik = (- parametrB - Math.sqrt(delta)) / 2 * parametrA;
System.out.println (", x2 = " + wynik);
}
39
}
}
}
}
2.17.
Napisz kod obliczajcy pierwiastki rwnania kwadratowego o parametrach zadanych w programie. Wykorzystaj instrukcj if...else if.
public
class Main
{
public static void main (String args[])
40
41
2.18.
Uywajc instrukcji switch, napisz program sprawdzajcy, czy warto zadeklarowanej zmiennej jest rwna 1, czy 10. Wywietl na ekranie stosowny komunikat.
public
class Main
{
public static void main (String args[])
{
int a = 10;
switch (a){
case 1 :
System.out.println("a = 1");
break;
case 10:
System.out.println("a = 10");
break;
default:
System.out.println("a nie jest rwne ani 1, ani 10.");
}
}
}
42
2.19.
Zmodyfikuj kod z wiczenia 2.18, usuwajc instrukcj break. Zaobserwuj, jak zmienio si dziaanie programu.
public
class Main
{
public static void main (String args[])
{
int a = 10;
switch (a){
case 1:
System.out.println("a = 1");
case 10:
System.out.println("a = 10");
default:
System.out.println("a nie jest rwne ani 1, ani 10");
}
}
}
Ptla for
Ptle w jzykach programowania pozwalaj na wykonywanie powtarzajcych si czynnoci. Nie inaczej jest w Javie. Jeli chcemy np.
wypisa na ekranie 10 razy napis Java, to moemy zrobi to, piszc
43
2.20.
Wykorzystujc ptl typu for, napisz program wywietlajcy na ekranie 10 razy napis Java.
public
class Main
{
public static void main (String args[])
{
for (int i = 1; i <= 10; i++){
System.out.println ("Java");
}
}
}
Zmienna i to tzw. zmienna iteracyjna, ktrej na pocztku przypisujemy warto 1 (int i = 1). Nastpnie w kadym przebiegu ptli jest
ona zwikszana o jeden (i++) oraz wykonywana jest instrukcja System.out.println ("Java");. Wszystko trwa tak dugo, a i osignie
warto 10 (i <= 10).
Wyraenie modyfikujce jest zwykle uywane do modyfikacji zmiennej iteracyjnej. Takiej modyfikacji moemy jednak dokona rwnie
wewntrz ptli. Struktura tego typu wyglda nastpujco:
for (wyraenie pocztkowe; wyraenie warunkowe;){
instrukcje do wykonania
wyraenie modyfikujce
}
44
W I C Z E N I E
2.21.
Zmodyfikuj ptl typu for z wiczenia 2.20 tak, aby wyraenie modyfikujce znalazo si w bloku instrukcji.
public
class Main
{
public static void main (String args[])
{
for (int i = 1; i <= 10;){
System.out.println ("Java");
i++;
}
}
}
Zwrmy uwag, e mimo i wyraenie modyfikujce jest teraz wewntrz ptli, rednik znajdujcy si po i <= 10 jest niezbdny! Jeli
o nim zapomnimy, kompilator zgosi bd.
Kolejn ciekaw moliwoci jest poczenie wyraenia warunkowego
i modyfikujcego.
W I C Z E N I E
2.22.
Napisz tak ptl typu for, aby wyraenie warunkowe byo jednoczenie wyraeniem modyfikujcym.
public
class Main
{
public static void main (String args[])
{
for (int i = 1; i++ <= 10;){
System.out.println ("Java");
}
}
}
W podobny sposb jak w poprzednich przykadach moemy si pozby wyraenia pocztkowego, ktre przeniesiemy przed ptl. Schemat wyglda nastpujco:
wyraenie pocztkowe;
for (; wyraenie warunkowe;){
instrukcje do wykonania
wyraenie modyfikujce
}
45
W I C Z E N I E
2.23.
Skoro zaszlimy ju tak daleko w pozbywaniu si wyrae sterujcych, usumy rwnie wyraenie warunkowe. Jest to jak najbardziej
moliwe!
W I C Z E N I E
2.24.
46
2.25.
2.26.
47
Ptla while
O ile ptla typu for suy raczej do wykonywania znanej z gry liczby operacji, to w przypadku ptli while liczba ta nie jest zwykle znana. Nie jest to, oczywicie, obligatoryjny podzia. Tak naprawd obie
mona napisa w taki sposb, aby byy swoimi funkcjonalnymi odpowiednikami. Oglna konstrukcja ptli typu while jest nastpujca:
while (wyraenie warunkowe){
instrukcje
}
2.27.
2.28.
Poczone wyraenia
48
W I C Z E N I E
2.29.
Ptla do...while
Istnieje jeszcze jedna odmiana ptli. Jest to do...while. Jej konstrukcja jest nastpujca:
do{
instrukcje;
}
while (warunek);
W I C Z E N I E
2.30.
49
int i = 1;
do{
System.out.println ("Java");
}
while (i++ <= 9);
}
}
Wydawa by si mogo, e to przecie to samo, co zwyka ptla while. Jest jednak pewna rnica. Ot w przypadku ptli do...while
instrukcje wykonane s co najmniej jeden raz, nawet jeli warunek
jest na pewno faszywy.
W I C Z E N I E
2.31.
Zmodyfikuj kod z wiczenia 2.30 w taki sposb, aby wyraenie warunkowe na pewno byo faszywe. Zaobserwuj wyniki dziaania programu.
public
class Main
{
public static void main (String args[])
{
int i = 10;
do{
System.out.println ("Java");
}
while (i++ <= 9);
}
}
Ptla foreach
Poczwszy od wersji 1.5 (5.0), Java udostpnia nowy rodzaj ptli.
Jest ona nazywana ptl foreach lub rozszerzon ptl for (z ang.
enhanced for) i pozwala na automatyczn iteracj po kolekcji obiektw lub te po tablicy. Jej dziaanie pokaemy wanie w tym drugim
przypadku. Jeli bowiem mamy tablic tab zawierajc wartoci
pewnego typu, to do przejrzenia wszystkich jej elementw moemy
uy konstrukcji w postaci:
for(typ val: tablica){
//instrukcje
}
50
2.32.
Zadeklaruj tablic liczb typu int i wypenij j przykadowymi danymi. Nastpnie uyj rozszerzonej ptli for do wywietlenia zawartoci tablicy na ekranie.
public
class Main
{
public static void main (String args[])
{
int tab[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for(int val: tab){
System.out.println(val);
}
}
}