Jezyk Java - Katedra Informatyki > Home

Transkrypt

Jezyk Java - Katedra Informatyki > Home
Plan zaje˛ ć
Jezyk
˛
Java.
1. Literatura
Cezary Bolek
[email protected]
2. Historia jezyka
˛
Java
Uniwersytet Łódzki
Katedra Informatyki
3. Podstawy programowania w jezyku
˛
Java
4. Programowanie obiektowe
5. Podstawy tworzenia appletów
6. Programowanie komponentowe
Jezyk
˛
Java
Literatura
Cezary Bolek <[email protected]>
⊙
⊳1⊲
Krótka historia jezyków
˛
programowania (1)
• Era „trudnych poczatków”.
˛
Lata 50-te, 60-te i poczatek
˛
70-tych. Wiele różnych jezyków
˛
programowania, cz˛esto dość hermetycznych i ukierunkowanych na
rozwiazywanie
˛
określonych problemów. F ORTRAN, C OBOL, S IMULA,
A LGOL, PASCAL
• Herbert Schildt — „Programowanie. Java 2”, Wydawnictwo RM,
Warszawa 2002
• Bruce Eckel — „Thinking in Java”
Cz˛eść jezyków
˛
(np. Fortran, Cobol) nie były zaprojektowane zgodnie z
zasadami strukturalnymi. Problemy tworzenia programów czytelnych i
łatwo modyfikowalnych.
Inne (np. Algol, Pascal) nie oferowały zadowalajacej
˛ wydajności.
• S. Holzner — Java 1.2. Szybkie wprowadzenie, Wydawnictwo HELP,
Warszawa 1999
˛
C”.
• Era „jezyka
Lata 70-te, 80-te. Opracowany przez programistów dla programistów.
Cechuje sie˛ duża˛ wydajnościa,
˛ przenośnościa,
˛ zapewnia mechanizmy
programowania strukturalnego.
Jezyk
˛
C zawiera mechanizmy programowania wysoko– jak i
niskopoziomowego. Stał sie˛ standardem przy tworzeniu małych
programów jak i dużych aplikacji.
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳2⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳3⊲
Dlaczego Java ?
Krótka historia jezyków
˛
programowania (2)
• Prostota
• Era „poczatków
˛
popularności programowania obiektowego”.
Lata 80-tych i 90-te. Wiaże
˛ sie˛ z powstaniem szeregu rozszerzeń
obiektowych istniejacych
˛
jezyków,
˛
jak i zupełnie nowych jezyków
˛
programowania zorientowanych obiektowo.
Łatwa dla nauczenia dla poczatkuj
˛ acych
˛
jak i profesjonalistów (majacych
˛
np. duże
doświadczenie z C/C++. Nie posiada zaskakujacych
˛
właściwości. Niewielka liczba jasno
zdefiniowanych sposobów realizacji danego zadania
Rosnacy
˛ poziom złożoności aplikacji wymusiła spopularyzowanie sie˛
koncepcji programowania obiektowego. Jezyk
˛
C++ jest odpowiedzia˛ na te˛
potrzebe.
˛ Rozszerza on Jezyk
˛
C o mechanizmy obiektowe. Zdobywa
bardzo szybko popularność dzieki
˛ zachowaniu wydajności i uniwersalności
swego poprzednika.
Przez wiele lat jest standardem przy tworzeniu nowoczesnych aplikacji.
• Era „oprogramowania niezależnego od środowiska”.
Lata 90-te i poczatki
˛ XXI wieku, eksplozja programowania rozproszonego,
rozwój internetu. Potrzeba świeżego spojrzenia na problem tworzenia
aplikacji.
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳4⊲
• Bezpieczeństwo
dzieki
˛ mechanizmowi maszyny wirtualnej, można w prosty sposób ograniczyć dostep
˛
programu do elementów systemu operacyjnego/komputera
• Przenośność
• Obiektowość
zaprojektowana od podstaw. Jasne i pragmatyczne podejście do obiektów. Model
obiektowy prosty i łatwy do rozszerzania, podczas gdy proste typy (np. liczby całkowite) sa˛
zachowane jako wysoko wydajne elementy nieobiektowe
• Solidność
ścisła kontrola typów, sprawdzanie kodu podczas kompilacji jak i wykonania. Rozwiazanie
˛
problemu zarzadzania
˛
pamieci
˛ a˛ jak i błedów
˛
wykonania
Jezyk
˛
Java
Dlaczego Java ? (cd.)
proste i eleganckie , a mimo to wyrafinowane rozwiazania
˛
synchronizacji wieloprocesowej.
Pozwala na koncentracje˛ nad właściwościami programu, a nie nad podsystemem
wielozadaniowości
⊳5⊲
• Wysoka wydajność
nie cierpi na „deficyt” jak inne jezyki
˛
interpretowane nawet na mało wydajnych
platformach. Jej kod pośredni został zaprojektowany tak starannie, że korzystajac
˛ z
kompilatora just-in-time można go przekształcić bezpośrednio w kod maszynowy
procesora w celu uzyskania wysokiej wydajności
• Dynamika
programy w Javie niosa˛ pokaźna˛ ilość informacji o typie czasu wykonania, używanej do
weryfikowania i decydowania o dostepie
˛
do obiektów w czasie wykonywania programu
⊙
Java — wymyślona przez Jamesa Gostlinga, Patricka Naughtona, Chrisa
Watrha, Eda Franka i Mike’a Sheridana z firmy Sun Microsystems w 1991 r.
Poczatkowa
˛
nazwa Oak, w roku 1995 zmieniona na Java.
Poczatkowym
˛
bodźcem powstania była potrzeba istnienia jezyka
˛
niezależnego od platformy (neutralnego wzgledem
˛
architektury). Miał on być
wykorzystywany do tworzenia oprogramowania wbudowanego w różne
urzadzenia
˛
elektroniczne — kuchenki mikrofalowe, piloty zdalnego
sterowania, itp.
• Neutralna architektura
konstrukcja jezyka
˛
pozwala na realizacje środowiska uruchomieniowego aplikacji,
zapewniajacego
˛
stałe zachowanie programu, niezależne od środowiska
Cezary Bolek <[email protected]>
⊙
Jezyk
˛
Java — historia
• Wielowatkowość
˛
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊳6⊲
W tym czasie rozwój Internetu i jego popularyzacja przeorientowała główne
pole wykorzystania Javy. Gdyby nie ten fakt, Java pozostałaby zapewne
przydatnym, ale mało znanym jezykiem
˛
programowania elektroniki
powszechnego użytku. Powstanie WWW wypchneło
˛ Jav˛e na czoło jezyków
˛
komputerowych, gdyż sieć WWW wymaga przenośnych programów.
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳7⊲
Pierwszy program (1)
Kod pośredni — Wirtualna Maszyna Javy
Wyjściem kompilatora Javy nie jest kod wykonywalny, lecz kod pośredni.
Plik „Pierwszy.java”:
Kod pośredni (ang. bytecode) to w dużym stopniu zoptymalizowany zestaw
instrukcji, przeznaczony do wykonania przez system wykonawczy (ang.
run-time system) Javy — Wirtualna˛ Maszyne˛ Javy (ang. Java Virtual
Machine).
1
Wirtualna maszyna Javy jest interpreterem kodu pośredniego.
6
Zapewnia to przenośność programów. Jeśli w danym środowisku operacyjnym
istnieje pakiet wykonawczy (maszyna wirtualna Javy) można w nim uruchomić
dowolny program w Javie. Pomimo faktu, że realizacje JVM różnia˛ sie˛
pomiedzy
˛
platformami, jednak wszystkie te maszyny interpretuja˛ ten sam kod
pośredni Javy w identyczny sposób.
8
/∗
2
p i e r w s z y program w J a v i e
w y p i s u j a c y na e k r a n i e n a p i s " Witamy w J a v i e " ∗ /
3
class Pierwszy
{
/ / Program rozpoczyna s i e od wywolania main ( )
public s t a t i c void main ( S t r i n g args [ ] )
{
System . o u t . p r i n t l n ( "Witamy w Javie." ) ;
}
}
4
5
7
9
10
11
Fakt interpretacji kodu Javy pomaga w zapewnieniu bezpieczeństwa. Przez
to, że programy wykonywane sa˛ pod kontrola˛ JVM, maszyna ta może
powstrzymywać program przed generowaniem efektów ubocznych poza
systemem
Kompilacja programu:
c:\>javac Pierwszy.java
Utworzony zostaje plik: „Pierwszy.class” zawierajacy
˛ program
który można uruchomić wydajac
˛ polecenie:
c:\>java Pierwszy
Jezyk
˛
Java
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳8⊲
Pierwszy program (2)
Cezary Bolek <[email protected]>
⊙
⊳9⊲
Pierwszy program (3)
1
2
3
4
5
6
7
8
9
10
11
/∗
pi er ws z y program w J a v i e
w y p i s u j a c y na e k r a n i e napi s " Witamy w J a v i e " ∗ /
1
class Pierwszy
{
/ / Program rozpoczyna s i e od wywolania main ( )
public s t a t i c void main ( S t r i n g args [ ] )
{
System . out . p r i n t l n ( "Witamy w Javie." ) ;
}
}
4
5
6
2
3
7
8
9
10
11
Cezary Bolek <[email protected]>
⊙
pi er ws z y program w J a v i e
w y p i s u j a c y na e k r a n i e napi s " Witamy w J a v i e " ∗ /
class Pierwszy
{
/ / Program rozpoczyna s i e od wywolania main ( )
public s t a t i c void main ( S t r i n g args [ ] )
{
System . out . p r i n t l n ( "Witamy w Javie." ) ;
}
}
Linia 7: rozpoczyna metode˛ main(). Wykonywanie programu rozpoczyna sie˛ od tego
miejsca. Wszystkie programy (konsolowe) rozpoczynaja˛ swoje wykonywanie od
wywołania main().
Metoda main() pobiera pewne argumenty za pomoca˛ zmiennych wyspecyfikowanych
w nawiasach () — sa˛ to parametry metody. Parametr String args[] zawiera
parametry programu wywołane z linii komend.
Metoda main() rozpoczyna sie˛ w linii 8 (nawias otwierajacy
˛ {) i kończy w linii 10
(nawias zamykajacy
˛ })
Linia 9: Instrukcja powodujaca
˛ wyświetlenie informacji na ekranie, za pomoca˛
wbudowanej metody println
Linie 1–2 i 6: komentarze — wieloliniowy i jednoliniowy
Linia 4: słowo kluczowe class deklaruje definicje˛ nowej klasy, Pierwszy jest
identyfikatorem nowej klasy (nazwa).
˛ Cała definicja klasy znajduje sie˛ pomiedzy
˛
nawiasami klamrowymi ({) i (}). Aktywność programu ma miejsce wewnatrz
˛ tej
klasy – czyli wszystkie programy w Javie sa˛ obiektowe.
Jezyk
˛
Java
/∗
⊳ 10 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 11 ⊲
Podstawowe elementy jezyka
˛
Java
• Kategorie składniowe
1. Słowa kluczowe
np. void, class, public
Składnia jezyka
˛
— podstawy
• Typy danych
• Słowa kluczowe — 48
Typy danych
2. Separatory
{ } ( ) ; ,
abstract
boolean
break
bye
case
catch
char
class
Typy proste
3. Komentarze
// Komentarz
/* Komentarz */
Typy z³o¿one
4. Operatory
np. arytmetyczne + - * % ++ 5. Identyfikatory
⋆ nazw klas lub zmiennych
⋆ nazw funkcji
⋆ etykiet
⋆ stałych wyliczeniowych
Typy tablicowe
Typy obiektowe
Biblioteczne
Programisty
const
continue
default
do
double
else
extends
final
finally
float
for
goto
if
implements
import
instanceof
int
interface
long
native
new
package
private
protected
public
return
short
static
strictfp
super
switch
synchronized
this
throw
throws
transient
try
void
volatile
while
• Bloki kodu { } — logiczne grupowanie instrukcji.
Traktowane funkcjonalnie jak jedna instrukcja. Stosowane zwykle w konstrukcjach
sterujacych
˛
i do określania zasiegu
˛ zmiennych.
• Identyfikatory.
Stosowane do określania nazw zmiennych metod i klas. Identyfikatory moga˛ składać sie˛ z
dowolnej sekwencji liter, cyfr i znaku podkreślenia ( ), pod warunkiem, że:
⋆ nie zaczynaja˛ sie˛ od cyfry
⋆ nie sa˛ jednym ze słów kluczowych jezyka
˛
Java
• Wszystkie instrukcje kończy sie˛ znakiem średnika – ;
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 12 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 13 ⊲
• int – 32-bitowy typ ze znakiem
Zakres: (−231 ) . . . (231 − 1) → (od -2 147 483 648 do 2 147 483 647 )
Typy danych i zmiennych
Każda zmienna w jezyku
˛
Java ma ściśle określony typ. Wszelkie operacje
przypisania i przekazywania parametrów kontrolowane sa˛ pod katem
˛
zgodności typów – każda niezgodność jest błedem.
˛
Przykład deklaracji zmiennej:
i n t k , w, i ;
int a;
• long – 64-bitowy typ ze znakiem
Zakres: (−263 ) . . . (263 − 1) → (od -9 223 372 036 854 775 808 do 9 223 372 036 854 775 807 )
1. Typy całkowite — zdefiniowane sa˛ cztery typy całkowite o różnych
szerokościach (zakresach).
Wszystkie liczby całkowite sa˛ liczbami ze znakiem.
Przykład deklaracji zmiennej:
long k a r t ;
long sw2 ;
• byte – 8-bitowy typ ze znakiem
Zakres: (−27 ) . . . (27 − 1) → (od -128 do 127 )
Przykład deklaracji zmiennej:
2. Typy zmiennopozycyjne — używane przy obliczeniu wyrażeń
wymagajacych
˛
ułamkowej precyzji
byte a ;
byte c , d ;
• float – typ zmiennopozycyjny zajmujacy
˛ 32 bity pamieci
˛
• short – 16-bitowy typ ze znakiem
Zakres: (−215 ) . . . (215 − 1) → (od -32 768 do 32 767 )
Zakres: od ±3.4 · 10−38 do ±3.4 · 10+38
Przykład deklaracji zmiennej:
Przykład deklaracji zmiennej:
float x ;
f l o a t xy , dlugosc ;
short zm ;
short t e s t , a ;
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 14 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 15 ⊲
• double – typ zmiennopozycyjny zajmujacy
˛ 64 bity pamieci
˛
Zakres: od ±1.7 · 10−308 do ±1.7 · 10+308
4. Typy logiczny boolean — może przyjmować jedna˛ z dwóch wartości true
lub false (nie 0 i 1)
Przykład deklaracji zmiennej:
Jest to typ zwracany przede wszystkim przez operatory relacji i wykorzystywany jest
głównie przez instrukcje sterujace
˛
Przykład deklaracji zmiennej:
float x ;
f l o a t xy , dlugosc ;
boolean t e s t ;
3. Typy znakowy char — 16-bitowy typ reprezentujacy
˛ znak zgodnie ze
standardem Unicode.
Zapis liczb i stałych
Zastosowanie standardu Unicode zapewnia przenośność programów i niezależność od
platformy jezykowej.
˛
Na zmiennych znakowych można wykonywać operacje matematyczne. Wartości kodów
ASCII i Unicode sa˛ zgodne.
1. Liczby całkowite dziesietne
˛
1234
−34
2. liczby całkowite ósemkowe – jeśli zaczynaja˛ sie˛ od zera
0123 / / system osemkowy , wiec 09 by l oby bledem
Przykład deklaracji zmiennej:
3. liczby całkowite szesnastkowe – jeśli zaczynaja˛ sie˛ od ’0x’
char ch ;
char znak , c hr ;
0x1FA
4. liczby zmiennopozycyjne
2.0
Przykład przypisania wartości:
3.
3.001
3.14 e−12
−3.4E12
5. stałe znakowe
ch=’A’ ;
char znak=’w’
’x’
’@’
’\n’ / / znak konca l i n i i
6. łańcuchy znakowe
"Hello"
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 16 ⊲
Jezyk
˛
Java
Zmienne — podstawowe zasady używania
"Koniec\n"
Cezary Bolek <[email protected]>
⊙
Zasieg
˛ zmiennych — definiowany przez metode˛
• Wszystkie zmienne musza˛ zostać zadeklarowane przed ich użyciem
• zasieg
˛ definiowany jest nawiasami { }
• W linii deklaracji zmiennym można nadawać wartość:
• zmienne zadeklarowane wewnatrz
˛ zasiegu
˛
nie sa˛ widoczne poza nim
(hermetyzacja)
i n t a=100;
byte c =12 , d =34;
char x=’X’ ;
• zasiegi
˛ moga˛ być zagnieżdżone, a obiekty (np. zmienne) sa˛ widoczne w
zasiegu
˛
wewnetrznym
˛
• Zmienne można inicjować dynamicznie:
• deklaracja zmiennej może wystapić
˛ w dowolnym miejscu (ale zawsze
przed jej użyciem)
double a = 3 . 0 , b = 4 . 0 ;
double c = Math . s q r t ( a∗a+b∗b ) ;
• Zasieg
˛ i czas życia
• zmienne gina˛ podczas opuszczania zasiegu
˛
i nie zachowuja˛ wartości
podczas ponownego wejścia do tego zasiegu
˛
⋆ zasieg
˛ definiowany przez klase˛ (na razie nie omawiany)
• nie można deklarować zmiennej, gdy inna zmienna o takiej samej nazwie
istnieje w zasiegu
˛
zewnetrznym
˛
⋆ zasieg
˛ definiowany przez metode˛
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊳ 17 ⊲
⊙
⊳ 18 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 19 ⊲
2. Konwersja typu — rzutowanie
Automatyczna konwersja i promocja typów
W sytuacji, gdy automatyczna konwersja nie może być przeprowadzona,
można jawnie dokonać konwersji z jednego typu na inny.
Jeśli zmienne na których wykonywane sa˛ obliczenia matematyczne (lub
operacje przypisania) sa˛ różnych typów, może mieć miejsce automatyczna
konwersja badź
˛ należy taka˛ konwersje˛ wykonać samemu (jawnie).
double a ;
short k ;
k =( short ) a ;
1. Konwersja automatyczna
W sytuacji gdy wartość liczbowa nie mieści sie˛ w typie docelowym, dane
zostaja˛ zmodyfikowane.
Może wystapić
˛ gdy jeden typ danych przypisywany jest do innego typu
zmiennej, np:
i n t k =0;
double a = k ;
3. Promocja automatyczna
Podczas wykonywania operacji arytmetycznych wystepuje
˛
automatyczna
konwersja zgodnie z poniższymi regułami:
Warunkiem tego jednak jest:
• kompatybilność typów (typy musza˛ być liczbowe)
• typ docelowy musi być wiekszy
˛
lub równy typowi źródłowy
•
•
•
•
double a = 1 . 0 ;
short k =2;
a=k ; / / dobrze
k=a ; / / blad , k o m p i l a t o r z a s y g n a l i z u j e b l a d
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 20 ⊲
Jezyk
˛
Java
typy byte i short promowane sa˛ do int
jeżeli wyrażenie zawiera long, rezultat promowany jest do long
jeżeli wyrażenie zawiera float, rezultat promowany jest do float
jeżeli wyrażenie zawiera double, rezultat promowany jest do double
Cezary Bolek <[email protected]>
⊙
Operatory arytmetyczne
Automatyczna konwersja i promocja typów — przykłady
Operator
Poniższy program nie spowoduje przepełnienia zmiennych, gdyż przy
obliczaniu rezultatów działania operatorów, ich argumentu promowane sa˛ do
typu int.
+
*
/
%
++
––
byte a =40;
byte b =50;
byte c =100;
i n t d=a∗b / c ;
Bład
˛ w poniższym programie wynika z próby przypisania typu int (rezultat
mnożenia b*2 jest ’int’) do zmiennej ’b’ typu byte.
byte b =50;
b=b ∗ 2 ; / / b l a d
Wynik
dodawanie
odejmowanie
mnożenie
dzielenie
reszta z dzielenia
inkrementacja
dekrementacja
Operator inkrementancji (zwiekszenia
˛
o jeden) ma dwie formy: przedrostkowa˛ (prefiksowa)
˛ i
przyrostkowa˛ (sufiksowa).
˛
•
Operator przyrostkowy ++
n++
a=n++
⇒
⇒
n=n+1
a=n
n=n+1
•
Operator przedrostkowy ++
++n
a=++n
⇒
⇒
n=n+1
n=n+1
a=n
Poprawna forma:
byte b =50;
b =( byte ) ( b ∗ 2 ) ;
⊳ 21 ⊲
Działanie operatora dekrementacji jest analogiczne — efektem jest zmniejszenie wartości
zmiennej o jeden.
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 22 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 23 ⊲
Operatory przypisania
Operatory bitowe
Operatorem przypisania w jezyku
˛
Java jest =
Operator ten zwraca wartość przypisywana,
˛ dzieki
˛ temu możliwe sa˛
konstrukcje typu:
Operatory działajace
˛ na indywidualnych bitach swoich operandów. Stosowane
w odniesieniu do typów long, int, short, char i byte.
Operator
∼
&
|
^
>>
>>>
<<
<<<
a=b=c =0;
a=b +( c=d ) ;
Operatory przypisania arytmetycznego
Możliwe jest połaczenie
˛
operacji arytmetycznych z operacjami przypisania, czyli zapis
zmienna=zmienna op wartość
Można skrócić do formy
zmienna op= wartość
Przykłady:
a +=5; / / rownowazne a=a+5 , c z y l i zw iekszenie ’ a ’ o 5
b ∗=8; / / rownowazne b=b ∗8 , c z y l i pomnozenie ’ b ’ przez 8
c%=2; / / rownowazne c=c%2
d / = a+b / / rownowazne d=d / ( a+b )
Wynik
Negacja bitowa
Koniunkcja bitowa
Alternatywa bitowa
Bitowa różnica symetryczna
Przesuniecie
˛
w prawo
Przesuniecie
˛
w prawo z wypełnieniem zerami
Przesuniecie
˛
w lewo
Przesuniecie
˛
w lewo z wypełnieniem zerami
Wszystkie liczby w Javie przechowywane sa˛ w postaci kodu uzupełnienia
dwójkowego, dlatego bitowe operacje przesunieć
˛ wystepuj
˛ a˛ w dóch formach:
z zachowaniem znaku (>>, <<) i z wypełnieniem zerami (>>>, <<<).
Stosowanie tych operatorów pozwala na zwiekszenie
˛
szybkości kodu oraz uproszczenie kodu.
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 24 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Operatory bitowe – przykład
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class B i t L o g i c {
public s t a t i c void main ( S t r i n g args [ ] ) {
String binary [ ] = {
"0000" , "0001" , "0010" , "0011" , "0100" , "0101" , "0110" , "0111" ,
"1000" , "1001" , "1010" , "1011" , "1100" , "1101" , "1110" , "1111"
};
i n t a =3; / / 0+2+1 l u b 0011 dwojkowo
i n t b =6; / / 4+2+0 l u b 0110 dwojkowo
i n t c=a | b ;
i n t d=a&b ;
i n t e=a^b ;
i n t f =(~a & b ) | ( a & ~b ) ;
i n t g=~a & 0 x 0 f ;
System . out . p r i n t l n ( "
a="+ b i n a r y [ a ] ) ;
System . out . p r i n t l n ( "
b="+ b i n a r y [ b ] ) ;
1
a=0011
System . out . p r i n t l n ( "
a|b="+ b i n a r y [ c ] ) ;
2
b=0110
System . out . p r i n t l n ( "
a&b="+ b i n a r y [ d ] ) ;
3
a | b=0111
System . out . p r i n t l n ( "
a^b="+ b i n a r y [ e ] ) ;
4
a&b=0010
System . out . p r i n t l n ( "~a&b|a&~b="+ b i n a r y [ f ] ) ;
5
a^b=0101
System . out . p r i n t l n ( "
~a="+ b i n a r y [ g ] ) ;
6
~a&b | a&~b=0101
}
7
~a=1100
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊳ 25 ⊲
Operatory relacji
1
⊙
Zwracaja˛ wartość typu logicznego (boolean) określajac
˛ a˛ relacje˛ zachodzac
˛ a˛
miedzy
˛
argumentami.
Operator
==
!=
>
<
>=
<=
⊙
⊳ 26 ⊲
Wynik
równe
nie równe
wieksze
˛
niż
mniejsze niż
wieksze
˛
niż lub równe
mniejsze niż lub równe
a =4;
b =3;
a==b ; \ \ f a l s e
a<b ;
\ \ false
a>=b ; \ \ t r u e
boolean c= a ! = b ; \ \ c= t r u e
i f ( a >6) { }
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 27 ⊲
Operatory logiczne
Trójargumentowy operator ’?’
Operatory działajace
˛ na argumentach typu logicznego i zwracajace
˛ wartość
logiczna˛ (boolean).
Operator Wynik
&
iloczyn logiczny (ang. AND)
|
suma logiczny (ang. OR)
∧
alternatywa wykluczajaca
˛ (ang. exclusive OR)
!
jednoargumentowa negacja (ang. logical unary NOT )
&&
warunkowy iloczyn logiczny (ang. AND)
||
warunkowa suma logiczny (ang. OR)
Działanie operatorów
logicznych:
A
B
A&B
A|B
A∧B
!A
false
true
false
true
false
false
true
true
false
false
false
true
false
true
true
true
false
true
true
false
true
false
true
false
Operator zwraca różne wartości w zależności od spełnienia badź
˛ nie,
podanego warunku.
Ogólna postać stosowania operatora:
wyrażenie1 ? wyrażenie2 : wyrażenie3
• jeśli wyrażenie1==true
⇒
zwracana jest wartość wyrażenie2
• jeśli wyrażenie1==false
⇒
zwracana jest wartość wyrażenie3
Przykłady:
x= a<0 ? −a : a ;
/ / p r z y p i s u j e do ’ x ’ w artosc bezwzgledna ’ a ’
y= b==0 ? 0 : a / b ;
/ / z a b e z p i e c z n i e przed d z i e l e n i e m przez zero
Warunkowe operatory logiczne nie obliczaja˛ prawego operandu jeśli wynik może być
określony na podstawie wyłacznie
˛
lewego operandu.
i f ( denom ! =0 && num / denom>10) { . . . }
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 28 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
↓
Najniższy
() [] .
++ – – !
* / %
+ –
> >= < <=
== !=
&
∧
|
?:
= op=
Tablica jest struktura˛ danych składajac
˛ a˛ sie˛ z elementów tego samego typu,
np. int, double, char, etc.
Tablice w Javie sa˛ obiektami, co oznacza, że pewne operacje wykonuje sie˛ na
nich z wykorzystaniem ich własnych metod i zmiennych, np. rozmiar tablicy.
Deklaracje zmiennych tablicowych:
typ nazwa tablicy[];
Przykłady:
i n t Tab [ ] ;
Nawiasy pozwalaja˛ na grupowanie wyrażeń i zmiany kolejności wykonywania wyrażeń.
double A [ ]
Przykłady:
a&b | c&d ;
/ / j e s t rownowazny :
( a&b ) | ( c&d ) ; / / p r i o r y t e t ’ & ’ j e s t wyzszy n i z
a==b | c ;
/ / n i e j e s t rownowazny :
a==(b | c ) ; / / p r i o r y t e t ’ = = ’ j e s t wyzszy n i z ’ | ’
⊳ 29 ⊲
Tablice
Priorytet operatorów
Najwyższy
⊙
/ / d e k l a r a c j a t a b l i c y o nazwie ’ Tab ’
/ / z l o z o n e j z elementow t y p u ’ i n t ’
/ / t a b l i c a zlozona z elementow t y p u ’ double ’
Deklaracje takie tworza˛ zmienne tablicowe, ale nie przypisuja˛ im jeszcze
żadnej konkretnej tablicy.
Tablice˛ należy utworzyć przydzielajac
˛ odpowiedni rozmiar pamieci
˛ do do
zadeklarowanej zmiennej (dynamiczna alokacja pamieci):
˛
’| ’
a∗= b>0 & b<10 | b=−10 ? a%2+2 : a ;
nazwa tablicy=new typ[rozmiar ];
Nawiasy (także nadmiarowe) nie zmniejszaja˛ wydajności programu. Dodawanie nadmiarowych nawiasów w celu
poprawy czytelności programu nie wpływa negatywnie na program.
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 30 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 31 ⊲
Tablice
Tablice – odwoływanie do elementów
typ nazwa tablicy[];
nazwa tablicy=new typ[rozmiar ];
Do elementów tablicy można odwoływać sie˛ za pomoca˛ operatora
indeksowania [], czyli podajac
˛ po nazwie tablicy numer elementu w nawiasach
kwadratowych:
Przykład:
i n t Tab [ ] ;
Tab=new i n t [ 1 0 ] ;
Tab [ 3 ] = 0 ;
x=A [ s ] ;
A[ 2 ] = (A[ 0 ] +A [ 1 ] ) / 2 ;
double A [ ] ;
A=new double [ 5 0 0 ] ;
Indeksy tablicy rozpoczynaja˛ sie˛ od ZERA !, np:
Zwykle deklaracji zmiennej tablicowej i alokacji pamieci
˛ dokonuje sie˛ w jednej
linii:
i n t v [ ] = new
v [0]=3;
v [1]=7;
v [2]=1;
v [3]=5;
v [4]=2;
/ / v [5]=2;
i n t Tab [ ] = new i n t [ 1 0 ] ;
double A [ ] = new double [ 5 0 0 ] ;
Możliwe jest inicjowanie tablicy, tj. nadawanie jej elementom wartości już
podczas deklaracji:
int
Tab [ ] = { 0 , 2 , 4 , 6 , 8 , 1 0 , 1 2 , 1 4 , 1 6 , 1 8 } ;
int [5]
//
/ / p r z y p i s a n i e w a r t o s c i wszystkim
/ / elementom t a b l i c y
//
//
/ / Blad ! Indeks t a b l i c y poza zakresem
Rozmiar tablicy (i alokacja pamieci)
˛ jest obliczany na podstawie listy podanych
wartości.
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 32 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Tablice – rozmiar
⊙
⊳ 33 ⊲
Tablice wielowymiarowe
Tablice wielowymiarowe sa˛ w rzeczywistości tablicami tablic. Aby ja˛
zadeklarować należy podać każdy dodatkowy wymiar, np:
Rozmiar tablicy można poznać, gdyż dla każdej tablicy jest on dostepny
˛
w
zmiennej o nazwie „length” skojarzonej z każdym obiektem tablicowym.
nazwa tablicy.length
i n t X [ ] [ ] = new i n t [ 4 ] [ 5 ] ;
X[0] [0][0] [0][1] [0][2] [0][3] [0][4]
Przykład:
Program obliczajacy
˛ średnia˛ arytmetyczna˛ liczb w tablicy:
1
2
3
4
5
6
7
8
9
10
X[1] [1][0] [1][1] [1][2] [1][3] [1][4]
class s r e d n i a {
public s t a t i c void main ( S t r i n g args [ ] ) {
i n t Z[ ] = { 1 , 3 , 7 , 2 , − 5 , 3 2 , 8 , − 1 1 , 9 , 4 0 } ;
double sred =0;
f o r ( i n t i =0; i <Z . l e n g t h ; i ++)
sred+=Z [ i ] ;
sred / = Z . l e n g t h ;
System . o u t . p r i n t l n ( "Srednia="+sred ) ;
}
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Tablica
X[ ]
sk³adad siê
z 4 elementów
X[2] [2][0] [2][1] [2][2] [2][3] [2][4]
X[3] [3][0] [3][1] [3][2] [3][3] [3][4]
0
1
2
3
4
X[2][1]
a ka¿dy element tablicy X[ ]
jest tablic¹ 5-cio elementow¹
Do elementów tablic wielowymiarowych odwołuje sie˛ podajac
˛ po nazwie tablicy, wszystkie
indeksy elementu, np:
⊙
⊳ 34 ⊲
X[0][0]=12;
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 35 ⊲
Tablice wielowymiarowe
Instrukcje sterujace
˛ (1)
• Instrukcja wyboru ’if’
Rozmiar „pionowy” tablicy dwuwymiarowej to X.length.
Rozmiar „poziomy” tablicy dwuwymiarowej to rozmiar któregokolwiek z
elementów X[], np: X[1].length.
if (warunek)
instrukcja1;
else
instrukcja2;
Przykład:
Sumowanie wszystkich elementów tablicy.
1
2
3
4
f o r ( i n t i =0; i <F . l e n g t h ; i ++)
f o r ( i n t j =0; j <F [ i ] . l e n g t h ; j ++)
sum+=F [ i ] [ j ] ;
System . o u t . p r i n t l n ( "Suma="+sum ) ;
8
9
11
T
warunek
T
warunek
T
warunek
F
instrukcja1
instrukcja2
instrukcja1
instrukcja2
• Instrukcja iteracyjna ’do–while’
F
T
}
while(warunek) {
instrukcja1;
instrukcja2;
...
}
F
instrukcja2
F
}
10
warunek
if (warunek1) instrukcja1;
else if (warunek2) instrukcja2;
else if (warunek3) instrukcja3;
else instrukcja4;
5
7
T
instrukcja1
• Drabina ’if–else–if’
class sumtab {
public s t a t i c void main ( S t r i n g args [ ] ) {
double F [ ] [ ] = new double [ 1 0 0 0 ] [ 1 0 0 0 ] ; / / 1 mln l i c z b
double sum=0;
6
• Instrukcja iteracyjna ’while’
instrukcja3
warunek
F
do {
instrukcja1;
instrukcja2;
...
} while(warunek);
instrukcja4
instrukcja
T
warunek
F
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 36 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Instrukcje sterujace
˛ (2)
• Instrukcja iteracyjna ’for’
for( instr pocz ; warunek ; instr kon)
instrukcja;
instr_pocz
T
instrukcja
warunek
F
instrukcja
instr_kon
Cezary Bolek <[email protected]>
Instrukcje sterujace
˛ – przykłady
1
2
3
4
wyra¿enie
5
6
wartoϾ1
7
class srodek {
public s t a t i c void main ( S t r i n g args [ ] ) {
i n t i =40 , j =246;
while (++ i < −− j ) ;
System . out . p r i n t l n ( "srodek to "+ i ) ;
}
}
instrukcja
Instrukcja for:
instrukcja
wartoϾ2
f o r ( i n t i =1; i <=10; i ++) {
System . out . p r i n t l n ( n ) ;
}
1
break
2
3
Zasieg
˛ zmiennej i ograniczony jest tylko do ciała petli.
˛
instrukcja
instrukcja
break
instrukcja
class s i l n i a 1 {
public s t a t i c void main ( S t r i n g args [ ] ) {
3
i n t n =7;
4
i n t s =1;
1
2
5
instrukcja
default
Jezyk
˛
Java
⊳ 37 ⊲
Instrukcja while:
• Instrukcja wyboru ’switch’
switch(wyrażenie1) {
case wartość1 :
instrukcja;
instrukcja;
...
break;
case wartość2 :
instrukcja;
instrukcja;
...
break;
default:
instrukcja;
instrukcja;
...
break;
}
⊙
8
9
⊙
f o r ( i n t i =2; i <=n ; s=s∗ i ++) ;
System . out . p r i n t l n ( "n!="+s ) ;
6
7
⊳ 38 ⊲
}
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 39 ⊲
Instrukcje sterujace
˛ – przykłady
Instrukcje sterujace
˛ – przykłady, switch
Drabina if-else-if:
class poraroku {
public s t a t i c void main ( S t r i n g args [ ] ) {
3
i n t m i es i ac =5; / / maj
4
S t r i n g poraroku ;
1
2
5
6
i f ( m i es i ac ==12 | | m i es i ac ==1 | | m i es i ac ==2)
poraroku = "w zimie" ;
else i f ( m i es i ac ==3 | | m i es i ac ==4 | | m i es i ac ==5)
poraroku = "na wiosne" ;
else i f ( m i es i ac ==6 | | m i es i ac ==7 | | m i es i ac ==8)
poraroku = "w lecie" ;
else i f ( m i es i ac ==9 | | m i es i ac ==10 | | m i es i ac ==11)
poraroku = "na jesieni" ;
else poraroku = "Nieprawidlowy miesiac" ;
7
8
9
10
11
12
13
14
15
System . out . p r i n t l n ( "Miesiac "+ m i es i ac +" jest "+ poraroku ) ;
16
17
18
}
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
1 class poraroku2 {
2
public s t a t i c void main ( S t r i n g args [ ] ) {
3
i n t m ies iac = 10;
4
switch ( m ies iac ) {
5
case 12:
6
case 1 :
7
case 2 :
8
System . out . p r i n t l n ( "Miesiac "+ m ies iac +" to zima" ) ;
9
break ;
10
case 3 :
11
case 4 :
12
case 5 :
13
System . out . p r i n t l n ( "Miesiac "+ m ies iac +" to wiosna" ) ;
14
break ;
15
case 6 :
16
case 7 :
17
case 8 :
18
System . out . p r i n t l n ( "Miesiac "+ m ies iac +" to lato" ) ;
19
break ;
20
case 9 :
21
case 10:
22
case 11:
23
System . out . p r i n t l n ( "Miesiac "+ m ies iac +" to jesien" ) ;
24
break ;
25
default :
26
System . out . p r i n t l n ( "Nieprawidlowy miesiac" ) ;
27
}
28
}
29 }
⊳ 40 ⊲
Jezyk
˛
Java
Instrukcja ’break’
i = −10;
while ( i ++<10) {
i f ( i ==0) continue ;
b =1/ i ;
}
Po instrukcji break sterowanie przekazywane jest do nastepnej
˛
instrukcji petli.
˛
Przykład:
4
5
6
7
8
9
10
11
12
⊳ 41 ⊲
Instrukcja continue przerywa bieżacy
˛ cykl iteracyjny i wymusza nastepny.
˛
f o r ( i n t i =1; ; i ++)
i f ( i ==10) break ;
2
3
⊙
Instrukcja ’continue’
Przez użycie instrukcji break można wymusić natychmiastowe zakończenie
bieżacej
˛ petli,
˛ pomijajac
˛ wyrażenie warunkowe i pozostały kod w ciele petli.
˛
1
Cezary Bolek <[email protected]>
class i l o c z y n y 3 {
public s t a t i c void main ( S t r i n g args [ ] )
{
f o r ( i n t i =1; i <=10; i ++) {
f o r ( i n t j =1; j <=10; j ++) {
System . out . p r i n t ( ( i ∗ j <10 ? " " : "")+ i ∗ j +" " ) ;
i f ( j == i ) break ;
}
System . out . p r i n t l n ( ) ;
}
}
}
Program obliczajace
˛ podzielniki liczby:
1
2
3
4
5
6
7
Instrukcji break kończy tylko bieżac
˛ a˛ petl
˛ e,
˛ jeśli jest ona zagnieżdżona to sterowanie wraca
do petli
˛ zewnetrznej.
˛
8
9
10
class p o d z i e l n i k i {
public s t a t i c void main ( S t r i n g args [ ] )
{
i n t x =81;
f o r ( i n t i =2; i <x ; i ++) {
i f ( x%i ! = 0 ) continue ;
System . o u t . p r i n t l n ( x+" jest podzielne przez "+ i ) ;
}
}
}
Instrukcji break przerywa wykonywanie działania instrukcji if, while, do–while, for.
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 42 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 43 ⊲
Obsługa łańcuchów tekstowych
Operacje na łańcuchach - scalanie (konkatenacja)
Łańcuchy w jezyku
˛
Java służa˛ do przetwarzania danych tekstowych, czyli
danych złożonych z ciagu
˛ znaków alfanumerycznych.
Łańcuchy deklaruje sie˛ używajac
˛ klasy String, np:
String s ;
Łańcuchy musza˛ być przed użyciem zainicjowane, tzn. należy im przypisać
konkretny ciag
˛ znaków (stała˛ łańcuchowa),
˛ np:
String s ;
s="Tekst" ;
Operator + pozwala na łaczenie
˛
łańcuchów w jeden, np:
S t r i n g s1="Ala " ;
S t r i n g s2="ma " ;
S t r i n g s3="kota" ;
S t r i n g s4 ;
s4=s1+s2+s3 ;
Stałe łańcuchowe sa˛ także typu String, wobec czego moga˛ być parametrami
operatora ’+’:
lub od razu podczas deklaracji:
S t r i n g s1="Ala "+"ma "+"kota" ;
S t r i n g s2=s1+" i psa" ;
S t r i n g s="Tekst" ;
S t r i n g w="" ; / / d e k l a r a c j a lancucha pustego
Podczas scalania, łańcuch może wykorzystywać swoja˛ aktualna˛ zawartość:
Zmienne łańcuchowe można przypisywać do innych zmiennych tego typu. W
takiej sytuacji łańcuch docelowy składa sie˛ z ciagu
˛ znaków bed
˛ acych
˛
kopia˛
łańcucha źródłowego:
S t r i n g s="Dzis jest " ;
s=s+"niedziela" ;
s+=" palmowa" ;
S t r i n g s="Tekst" ;
S t r i n g w;
w=s ; / / umieszczenie w zmiennej ’w ’ k o p i i t e k s t u zmiennej ’ s ’
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 44 ⊲
Jezyk
˛
Java
Operacje na łańcuchach - scalanie (konkatenacja)
⊳ 45 ⊲
W jezyku
˛
Java, łańcuchy sa˛ obiektami, a nie zmiennymi prostymi. Oznacza to, że po
zadeklarowaniu obiektu łańcuchowego można wykonywać zwiazane
˛
z tym łańcuchem
operacje (metody).
W szczególności:
i n t wiek =7;
S t r i n g s="Ala ma "+wiek+" lat" ;
• w celu poznania długości łańcucha, należy odwołać sie˛ do jego metody length(), np:
Użycie szeregu operatorów ’+’ powoduje, że operacje wykonywane sa˛ kolejno
od lewej do prawej, wiec
˛ operacja:
S t r i n g s="Dwa plus dwa="+2+2;
System . o u t . p r i n t l n ( s ) ;
S t r i n g s="Ala ma kota" ;
int x ;
x=s . l e n g t h ( ) ;
• w celu odczytania z łańcucha jednego znaku na określonej pozycji, należy odwołać sie˛ do
metody charAt(i), np:
da w wyniku:
S t r i n g s="Ala ma kota" ;
char z ;
z=s . c har A t ( 4 ) ; / / zwraca znak ’m ’
Dwa p l u s dwa=22
Uwaga! Pozycje znaków w łańcuchu zaczynaja˛ sie˛ od zera.
• w celu odczytania z łańcucha jego fragmentu należy odwołać sie˛ do metody
substring(i,k), np:
Kolejność wykonywanych operacji można zmienić stosujac
˛ nawiasy:
S t r i n g s="Dwa plus dwa=" + ( 2 + 2 ) ;
System . o u t . p r i n t l n ( s ) ;
S t r i n g s1="Ala ma kota" ;
S t r i n g s2="Ola" ;
S t r i n g s3=s2+s1 . s u b s t r i n g ( 3 , s1 . l e n g t h ( ) − 1 ) ;
Wynik działania programu:
Dwa p l u s dwa=4
Cezary Bolek <[email protected]>
⊙
Operacje na łańcuchach - obiektowość
Podczas scalania łańcuchów, parametrem operatora ’+’ moga˛ być zmienne
innych typów, które zostana˛ automatycznie przekonwertowane na typ
łańcuchowy, np:
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 46 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 47 ⊲
Operacje na łańcuchach - przykłady
Operacje na łańcuchach - porównywanie
1
2
3
4
5
6
7
8
class odwr1 {
public s t a t i c void main ( S t r i n g args [ ] ) {
S t r i n g s="Ala ma kota" ;
i n t i =s . l e n g t h ( ) ;
while ( i −−>0)
System . o u t . p r i n t ( s . c h a r A t ( i ) ) ;
}
}
Operator ’==’ zastosowany do obiektów String pozwala sprawdzić, czy obiekty te odwołuja˛
sie˛ do tego samego łańcucha (czyli nie porównuje sie˛ dwóch różnych łańcuchów), np:
S t r i n g s1="Pierwszy" ;
S t r i n g s2="" ;
s2=s2+"Pierwszy" ;
System . o u t . p r i n t l n ( s1==s2 ) ;
Do porównywania zawartości dwóch łańcuchów wykorzystuje sie˛ metode˛ equals:
System . o u t . p r i n t l n ( s1 . equals ( s2 ) ) ;
1
2
3
4
5
6
7
class odwr2 {
public s t a t i c void main ( S t r i n g args [ ] ) {
S t r i n g s="Ala ma kota" ;
f o r ( i n t i =s . l e n g t h () − 1; i >=0; i −−)
System . o u t . p r i n t ( s . c h a r A t ( i ) ) ;
}
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
/ / drukuje true
Aby sprawdzić, który z łańcuchów jest „mniejszy” lub „wiekszy”,
˛
czyli znajduje sie˛ przed, lub
po danym łańcuchu w porzadku
˛
alfabetycznym, stosuje sie˛ metode˛ compareTo, np:
S t r i n g s1="Kowalski" ;
S t r i n g s2="Nowak" ;
i n t k=s1 . compareTo ( s2 ) ;
⊙
/ / porownuje s1 z s2
Metoda zwraca wartość:
0
<0
>0
⊳ 48 ⊲
Jezyk
˛
Java
-
jeśli łańcuchy sa˛ identyczne
jeśli s1 jest w słowniku przed s2
jeśli s1 jest w słowniku po s2
Cezary Bolek <[email protected]>
⊙
⊳ 49 ⊲
Metody i zmienne statyczne
Operacje na łańcuchach - porównywanie
Wewnatrz
˛ danej klasy można deklarować różne metody, poza już istniejac
˛ a˛
metoda˛ main, do których można sie˛ odwoływać jak do podprogramów
(procedur).
S t r i n g s1="Adam" ;
S t r i n g s2="Krzysztof" ;
S t r i n g s3="Stefan" ;
S t r i n g s4="andrzej" ;
System . out . p r i n t l n ( s2 . compareTo ( s1 ) > 0 ) ;
System . out . p r i n t l n ( s2 . compareTo ( s3 ) > 0 ) ;
System . out . p r i n t l n ( s2 . compareTo ( s4 ) > 0 ) ;
W deklaracji metody należy wyspecyfikować ile i jakich typów, parametry przekazuje sie˛ do
metody oraz jakiego typu jest zwracana wartość (wynik działania metody). Słowo static
oznacza, że można do danej metody odwoływać sie˛ jak do typowego podprogramu, tj. bez
deklaracji obiektu danej klasy.
powyższy program wydrukuje nastepuj
˛ ace
˛ wartości:
true
false
false
Przykład:
1
2
co oznacza, że metoda compareTo traktuje wielkie litery, jako znaki poprzedzajace
˛
alfabetycznie litery małe. Aby dokonać porównania łańcuchów ignorujac
˛ wielkość liter należy
zastosować metode˛ compareToIgnoreCase:
System . out . p r i n t l n ( s2 . compareToIgnoreCase ( s1 ) > 0 ) ;
System . out . p r i n t l n ( s2 . compareToIgnoreCase ( s3 ) > 0 ) ;
System . out . p r i n t l n ( s2 . compareToIgnoreCase ( s4 ) > 0 ) ;
3
4
5
6
7
8
efektem jest:
9
true
false
true
Jezyk
˛
Java
/ / drukuje false
10
class kwadrat {
s t a t i c double kwad ( double x ) {
double s ;
s=x∗ x ;
return s ;
}
public s t a t i c void main ( S t r i n g args [ ] ) {
System . o u t . p r i n t l n ( kwad ( 7 ) ) ;
}
}
Wartość, która˛ zwraca metoda określa sie˛ instrukcja˛ return.
Cezary Bolek <[email protected]>
⊙
⊳ 50 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 51 ⊲
Metody i zmienne statyczne
Zmienne statyczne
Jeżeli metoda nie zwraca żadnego wyniku, wówczas deklarujac
˛ taka˛ metode˛
stosuje sie˛ jako zwracana˛ wartość, typ o nazwie void. Nie jest wówczas
wymagana instrukcja return.
void d r u k u j ( i n t x )
{
System . o u t . p r i n t l n ( "Zmienna wynosi:"+x ) ;
}
3
4
5
double P i ( )
{
r e t u r n 3.1415926535897;
}
public s t a t i c void main ( S t r i n g args [ ] )
{
drukuj ( Pi ( ) ) ;
}
Cezary Bolek <[email protected]>
1
2
Jeżeli metoda nie wymaga żadnych parametrów, wówczas lista parametrów w
deklaracji metody jest pusta, np:
Jezyk
˛
Java
Zmienne zadeklarowane wewnatrz
˛ klasy, poza metodami, jako static,
dostepne
˛
sa˛ we wszystkich metodach; moga˛ być modyfikowane i zachowuja˛
swoja˛ wartość przez cały czas wykonywania programu, np:
6
7
8
9
10
11
12
13
class s t a t {
s t a t i c i n t x =0;
s t a t i c void p l u s x ( i n t i )
{
x+= i ;
}
public s t a t i c void main ( S t r i n g args [ ] )
{
System . o u t . p r i n t l n ( "x="+x ) ;
plusx ( 3 ) ;
System . o u t . p r i n t l n ( "x="+x ) ;
}
}
Wynik działania programu:
x=0
x=3
⊙
⊳ 52 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 53 ⊲
Programowanie obiektowe
Programowanie obiektowe polega – w uproszczeniu – na organizacji
algorytmu i struktur danych w taki sposób, aby wyodrebnić
˛
i skojarzyć w
postaci struktur zwanych obiektami, dane i operujace
˛ na nich metody
(procedury). Przy takim podejściu program główny sprowadza sie˛ do operacji
na obiektach i ich wzajemnym oddziaływaniu i zależności.
Programowanie obiektowe
i aplety
Trzy zasady programowania obiektowego w jezyku
˛
Java:
• Hermetyzacja. Wszystkie zmienne i metody obiektu, które sa˛ konieczne
do jego działania, lecz nie sa˛ istotne dla użytkownika obiektu — sa˛
niewidoczne i niedostepne.
˛
• Dziedziczenie. Obiekty moga˛ dziedziczyć (nabywać cech innych
obiektów), co pozwala na proste tworzenie i używanie nawet bardzo
złożonych obiektów poprzez stopniowe dodawanie nowych cech do
kolejnych „generacji” obiektów.
• Polimorfizm. Zróżnicowanie działania obiektu w zależności od typu
danych. Obiekty używa sie˛ zawsze korzystajac
˛ z tych samych metod (ten
sam interfejs), ale ich działanie bedzie
˛
zależało od typu danych, na których
maja˛ operować.
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 54 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 55 ⊲
Programowanie obiektowe — klasy
Postać deklaracji klasy — przykład
Definicja klasy Box:
Klasa jest definicja˛ wzoru według którego tworzone sa˛ konkretne obiekty —
egzemplarze klasy.
class Box {
double x ;
double y ;
double z ;
}
Wewnatrz
˛ klasy definiuje sie˛ dwie cechy obiektu:
• Zmienne, które zostana˛ utworzone dla każdego obiektu tej klasy
• Metody, czyli procedury, które bed
˛ a˛ mogły wykonywać operacje na danym obiekcie, tj.
jego własnych danych.
class nazwaklasy {
typ zmienna;
..
typ zmienna;
Postać
deklaracji
klasy:


deklaracje zmiennych
typ metoda(parametry) {
...
}
typ metoda(parametry) {
...
}
}
Jezyk
˛
Java







pud1 . x =2;
pud2 . x =7;
6
7
8
11
12
deklaracje metod
obiektów danej klasy
13
14
pud1 . y =3;
pud2 . y =4;
pud1 . z =5;
pud2 . z =3;
double v1 = pud1 . x ∗ pud1 . y ∗ pud1 . z ;
double v2 = pud2 . x ∗ pud2 . y ∗ pud2 . z ;
System . out . p r i n t l n ( "Objetosc pud1="+v1 ) ;
System . out . p r i n t l n ( "Objetosc pud2="+v2 ) ;
9
10
Cezary Bolek <[email protected]>
}
}
Zmienne x, y, z istnieja˛ oddzielnie dla każdego obiektu.
Zmienne zadeklarowane bez słowa „static” istnieja˛ tylko razem z konkretnymi obiektami.
⊙
⊳ 56 ⊲
Deklarowanie obiektów
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 57 ⊲
Przypisywanie obiektów do zmiennych obiektowych (1)
Deklarowanie obiektów przebiega w dwóch etapach:
1.
Deklaracja zmiennej obiektowej
x
Box pud1;
@
I
@
typ klasy
pud1 = new Box();
null
@
y
zmienna obiektowa
Utworzenie obiektu w pamieci
˛ i przypisanie jego adresu do zmiennej
obiektowej
6
Zmienna
obiektowa
@
I
@
@
operator
tworzacy
nowy obiekt
Cezary Bolek <[email protected]>
Operator „new” tworzy nowy obiekt, tj. rezerwuje obszar pamieci
˛ na
wszystkie zmienne i metody danego obiektu a nastepnie
˛
zwraca adres
(referencje)
˛ tego obiektu w pamieci,
˛ który zostaje przypisany do zmiennej
obiektowej.
Zwykle deklaracje˛ zmiennej obiektowej i utworzenie obiektu łaczy
˛
sie˛ w jednej
linii:
Box pud1 = new Box();
pud1 = new Box();
Jezyk
˛
Java
pud1
z
pud1
Ponieważ obiekty sa˛ złożonymi strukturami, zmienna obiektowa nie jest obiektem,
a jedynie wskaźnikiem do miejsca w pamieci
˛ gdzie znajduje sie˛ właściwy obiekt
(referencja).
˛
Po deklaracji samej zmiennej obiektowej, nie wskazuje ona jeszcze na żaden obiekt (ma
wartość „null”).
2.
metoda tworzaca obiekt
o takiej samej nazwie
jak klasa obiektu
(tzw. konstruktor)
⊙
class t e s t B o x {
2
public s t a t i c void main ( S t r i n g args [ ] ) {
3
Box pud1=new Box ( ) ;
4
Box pud2=new Box ( ) ;
1
5
obiektów klasy








Od tej pory można już zadeklarować obiekty klasy Box i odwoływać sie˛ do ich zmiennych
według wzoru: obiekt.zmienna.
⊳ 58 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 59 ⊲
Przypisywanie obiektów do zmiennych obiektowych (2)
Przypisywanie obiektów do zmiennych obiektowych (3)
Box A = new Box();
Box B;
Zmienne obiektowe sa˛ jedynie wskaźnikami do obiektów, wiec
˛ operacje na
samych zmiennych obiektowych nie zmieniaja˛ ani nie tworza˛ nowych
obiektów, ale pozwalaja˛ na elastyczne odwoływanie sie˛ do obiektów.
Box B;
y
null
z
B
Po wykonaniu przypisania B=A, zmienna B wskazuje na ten sam obiekt co A.
Nie został utworzony nowy obiekt.
Można powiedzieć, że istniejacy
˛ obiekt ma teraz dwie nazwy: A i B.
Odwołania do zmiennych obiektu możliwe sa˛ poprzez nazwy A i B.
Przykładowo, A.x jest ta˛ sama˛ zmienna˛ co B.x
x
A
y
z
B = A;
Na przykład:
Box A = new Box();
x
A
B
Przykład:
Box A=new Box ( ) ;
Box B ;
B = A;
A . x =5;
A . y =7;
System . o u t . p r i n t l n ( B . x ) ;
W pamieci
˛ istnieje tylko jeden obiekt, wskazywany przez A, natomiast
zmienna obiektowa B nie wskazuje na żaden obiekt.
Co sie˛ stanie po wykonaniu poniższego przypisania ?
B=A;
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 60 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Metody (1)
Do wywoływania metody dla konkretnego obiektu stosuje sie˛ zapis:
obiekt.metoda(parametry)
1
2
3
4
5
/ / metoda o b l i c z a j a c a o b j e t o s c
6
7
8
9
10
Metoda objetosc() ma dostep
˛ do wszystkich zmiennych klasy tj. x, y, z, wiec
˛
nie wymaga przekazywania parametrów.
Metoda ta zwraca liczbe˛ typu double — objetość
˛
obiektu klasy Box.
Metoda deklarowana bez kwalifikatora „static” może być używana tylko dla
istniejacych
˛
obiektów.
Cezary Bolek <[email protected]>
⊳ 61 ⊲
Przykład:
Przykład:
Metoda obliczajaca
˛ objetość
˛
klasy Box:
Jezyk
˛
Java
⊙
Metody (2)
Metody sa˛ procedurami, które operuja˛ na zmiennych danego obiektu. Metode˛
wywołuje sie˛ zawsze dla danego obiektu.
class Box {
double x , y , z ;
double o b j e t o s c ( )
{
r e t u r n x∗y∗z ;
}
}
/ / w ypisanie na e k r a n i e l i c z b y 5
⊙
⊳ 62 ⊲
11
12
13
14
15
16
17
18
19
class Box {
double x , y , z ;
double o b j e t o s c ( )
{
r et u r n x∗ y ∗ z ;
}
}
/ / metoda o b l i c z a j a c a o b j e t o s c
class tes tB ox 1 {
public s t a t i c void main ( S t r i n g args [ ] )
Box pud1=new Box ( ) ;
Box pud2=pud1 ;
pud1 . x =2;
pud1 . y =2;
pud1 . z =3;
System . out . p r i n t l n ( pud1 . o b j e t o s c ( ) ) ;
System . out . p r i n t l n ( pud2 . o b j e t o s c ( ) ) ;
}
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
{
/ / w y p i s u j e 12
/ / w y p i s u j e 12
⊙
⊳ 63 ⊲
Metody — przykład
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Box {
double x , y , z ;
double o b j e t o s c ( )
/ / metoda o b l i c z a j a c a
{
r et u r n x∗ y ∗ z ;
}
void wymiar ( double a , double b , double c )
{
x=a ;
y=b ;
z=c ;
}
}
class tes tB ox 2 {
public s t a t i c void main ( S t r i n g args [ ] )
Box pud1=new Box ( ) ;
pud1 . wymiar ( 2 , 2 , 5 ) ;
System . out . p r i n t l n ( pud1 . o b j e t o s c ( ) ) ;
}
}
1
2
3
objetosc
4
5
6
7
8
/ / metoda u s t a w i a j a c a zmienne o b i e k t u
9
10
11
12
13
14
15
{
16
17
/ / w y p i s u j e 20
18
19
Metoda wymiar może być wywoływana dla każdego obiektu klas Box.
⊙
⊳ 64 ⊲
Jezyk
˛
Java
/ / metoda u s t a w i a j a c a zmienne o b i e k t u
{
/ / w y p i s u j e 20
⊙
⊳ 65 ⊲
⊙
⊳ 67 ⊲
Jak działa aplet ?
Aplety sa˛ to programy napisane w jezyku
˛
Java udostepniane
˛
przez serwer,
transportowane przez internet, automatyczne instalowane i uruchamiane jako
cz˛eść dokumentu WWW.
Aplet ma ograniczony dostep
˛ do zasobów komputera — wzgledy
˛
bezpieczeństwa.
Aplet może tworzyć interfejs multimedialny i wykonywać obliczenia, ale nie
może wykonywać operacji na plikach.
Najprostszy aplet:
2
objetosc
Cezary Bolek <[email protected]>
Wprowadzanie do apletów
1
Zmienne te mogłyby być niedostepne
˛
dla programisty, ale nie utrudniłoby to korzystanie z
obiektu (hermetyzacja).
Metoda nie zwraca żadnej wartości — void.
Cezary Bolek <[email protected]>
20
class Box {
double x , y , z ;
double o b j e t o s c ( )
/ / metoda o b l i c z a j a c a
{
r et u r n x∗ y ∗ z ;
}
void wymiar ( double a , double b , double c )
{
x=a ;
y=b ;
z=c ;
}
}
class tes tB ox 2 {
public s t a t i c void main ( S t r i n g args [ ] )
Box pud1=new Box ( ) ;
pud1 . wymiar ( 2 , 2 , 5 ) ;
System . out . p r i n t l n ( pud1 . o b j e t o s c ( ) ) ;
}
}
Dzieki
˛ tak zdefiniowanej metodzie wymiar odwoływanie sie˛ bezpośrednie do poszczególnych
zmiennych obiektu jako obiekt.zmienna nie jest już potrzebne.
Metoda przypisuje wartości parametrów od razu do wszystkich zmiennych obiektu.
Jezyk
˛
Java
Metody — przykład
Poznowne
za³adowanie strony
zawieraj¹cej aplet
init()
start()
Opuszczenie strony
zawieraj¹cej
aplet
import j a v a . awt . ∗ ;
import j a v a . a p p l e t . ∗ ;
Za³adowanie strony.
Inicjalizacja
apletu
Uruchomienie
apletu
paint()
3
4
5
6
7
8
9
10
public class s i m p l e extends A p p l e t
{
public void p a i n t ( Graphics g )
{
g . d r a w S t r i n g ( "Test" , 2 0 , 2 0 ) ;
}
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Zakoñczenie
dzia³ania apletu.
Usuniêcie
z pamiêci
stop()
Wyœwietlenie
zawartoœci apletu
destroy()
⊙
⊳ 66 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Szkielet apletu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Osadzanie apletu w dokumencie HTML
import j a v a . awt . ∗ ;
import j a v a . a p p l e t . ∗ ;
public class s k e l e t o n extends A p p l e t {
/ / Wywolywana j a k o pierwsza
public void i n i t ( ) {
// inicjacja
}
/ ∗ Wywolywana j a k o druga , po i n i t ( ) . Metoda t a j e s t tak z e
wywolywana pr z y wznawianiu wykonywania a p l e t u . ∗ /
public void s t a r t ( ) {
/ / poczatek l u b wznowienie wykonania
}
/ / Wywolywana pr z y zatrzymywaniu a p l e t u .
public void s top ( ) {
/ / przerwa w wykonaniu
}
/ ∗ Wywolywana pr z y zamykaniu a p l e t u . J e s t t o o s t a t n i a
wykonywana metoda . ∗ /
public void d e s t r o y ( ) {
/ / wykonujemy c z y nnos c i zwiazane z zamykaniem
}
/ / Wywolywana pr z y w y s w i e t l a n i u okna a p l e t u .
public void p a i n t ( Graphics g ) {
/ / ponownie wyswietlamy zawartosc okna
}
}
<html>
<body>
<center>
<p>Oto a p l e t : < / p>
< a p p l e t code="simple.class" width =200 height =80>< / a p p l e t >
< / body>
< / html>
Przegladarka
˛
internetowa po załadowaniu dokumentu HTML ładuje plik programu
’simple.class’ z serwera. Nastepnie
˛
uruchamiana jest JVM, która tworzy obiekt klasy simple
by nastepnie
˛
wywołać odpowiednie metody: init(), start(), stop(), destroy(),
paint() (jeśli sa˛ zdefiniowane).
1
2
3
import j a v a . awt . ∗ ;
import j a v a . a p p l e t . ∗ ;
public class s i m pl e extends A p p l e t
{
public void p a i n t ( Graphics g )
{
8
g . d r a w S t r i n g ( "Test" , 2 0 , 2 0 ) ;
9
}
10 }
4
5
6
7
⊙
⊳ 68 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Kontrola dostepu
˛
3
4
5
6
7
8
9
10
11
12
13
14
import j a v a . awt . ∗ ;
import j a v a . a p p l e t . ∗ ;
public class KontoApl1 extends A p p l e t {
Konto k n t ;
public void i n i t ( ) {
k n t =new Konto ( ) ;
k n t . wplac ( 5 6 0 . 1 ) ; k n t . wyplac ( 6 0 0 ) ;
/ / k n t . kwota −=600; bl ad !
}
public void p a i n t ( Graphics g ) {
g . d r a w S t r i n g ( "saldo:"+ k n t . s al do ( ) ,
10 ,50);
}
}
17
18
19
20
21
22
23
24
25
26
27
28
class Konto {
p r i v a t e double kwota ;
double s al do ( ) {
r et u r n kwota ;
}
public void wplac ( double k ) {
kwota+=k ;
}
public boolean wyplac ( double k ) {
i f ( kwota−k <0) r et u r n f a l s e ;
kwota−=k ;
r et u r n t r u e ;
}
}
Dostep
˛ do składowych klasy (funkcji i zmiennych) może
zostać ograniczony tak aby były one dostepne
˛
tylko dla
funkcji składowych danej klasy.
Cezary Bolek <[email protected]>
Podczas tworzenia obiektu operator
„new” wywołuje metode˛ o takiej
samej nazwie jak klasa obiektu.
Metoda taka nosi nazwe˛
konstruktora.
Konstruktory wykorzystuje sie˛ do
nadawania (inicjowania)
poczatkowych
˛
wartości zmiennym
obiektu podczas jego tworzenia.
Konstruktor musi mieć te˛ sama˛
nazwe˛ jak klasa obiektu i nie może
zwracać żadnego typu (zawsze
zwracana jest referencja do
tworzonego obiektu).
Jeżeli w klasie nie zadeklarowano
konstruktora, to automatycznie
tworzony jest i wywoływany tzw.
konstruktor domyślny, który zeruje
wszystkie zmienne obiektu.
• private – dostep
˛ tylko dla składowych danej klasy
• public – dostep
˛ z dowolnego kodu w programie
• brak specyfikatora – dostep
˛ publiczny tylko wewnatrz
˛
pakietu, w którym zdefiniowana jest klasa
Jezyk
˛
Java
⊳ 69 ⊲
15
16
⊙
Konstruktory
1
2
⊙
⊳ 70 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Konto {
p r i v a t e double kwota ;
public Konto ( double k ) {
kwota=k ;
}
double s al do ( ) {
r et u r n kwota ;
}
public void wplac ( double k ) {
kwota+=k ;
}
public boolean wyplac ( double k ) {
i f ( kwota−k <0) r et u r n f a l s e ;
kwota−=k ;
r et u r n t r u e ;
}
}
public class KontoApl2 extends A p p l e t {
Konto k n t ;
public void i n i t ( ) {
k n t =new Konto ( 5 6 0 . 1 ) ;
}
public void p a i n t ( Graphics g ) {
g . d r a w S t r i n g ( "saldo:"+ k n t . s al do ( ) , 1 0 , 5 0 ) ;
}
}
⊙
⊳ 71 ⊲
Przeciażanie
˛
metod
Stosowanie obiektów jako parametrów
12
4
5
6
7
Wewnatrz
˛ klasy możliwe jest
deklarowanie metod o tej samej
nazwie, pod warunkiem że różnia˛ sie˛
one liczba˛ badź
˛ typem parametrów.
W takiej sytuacji wywoływana jest
odpowiednia metoda (zgodnie z
liczba˛ i typem parametrów metody)
podczas wykonywania programu.
Przeciażanie
˛
może odnosić sie˛
zarówno do zwykłych metod jak i
konstruktorów
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Konto {
p r i v a t e double kwota ;
public Konto ( ) {
kwota =0;
}
public Konto ( double k ) {
kwota=k ;
}
double s al do ( ) {
r et u r n kwota ;
}
public void wplac ( double k ) {
kwota+=k ;
}
public void wplac ( double k , double pr owi z ) {
kwota+=k+ pr owi z ;
}
}
k nt1 =new Konto ( ) ;
k nt2 =new Konto ( 4 0 0 ) ;
k nt2 . wplac ( 1 0 0 . ) ;
k nt2 . wplac ( 1 0 0 , 1 ) ;
26
27
28
29
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Parametrami metod oprócz
wbudowanych typów prostych (int,
double itp.) moga˛ być także obiekty.
Metody moga˛ także zwracać obiekty.
W obydwu przypadkach pobierana
lub zwracana jest w rzeczywistości
tylko referencja do obiektu danej
klasy.
Proces ten nosi nazwe˛ dziedziczenia i
pozwala łatwo tworzyć hierarchie˛ klas –
od najprostszych do bardzo złożonych.
Nadklasa
Konto
kwota
double saldo()
void wplac(..)
boolean wyplac(..)
Podklasy
KontoStandard
KontoVIP
kwota
double saldo()
void wplac(..)
boolean wyplac(..)
boolean przelejDo(...)
kwota
double saldo()
void wplac(..)
boolean wyplac(..)
boolean przelejDo(...)
Aby dziedziczyć klasy, należy dołaczyć
˛
jej definicje˛
słowem: extends
Jezyk
˛
Java
Cezary Bolek <[email protected]>
18
19
20
21
22
23
public void wplac ( double k ) {
kwota+=k ;
}
public boolean wyplac ( double k ) {
i f ( kwota−k <0) r et u r n f a l s e ;
kwota−=k ; r et u r n t r u e ;
}
boolean p r z e l e j D o ( Konto knt , double k ) {
i f ( wyplac ( k ) ) {
k n t . wplac ( k ) ;
r et u r n t r u e ;
}
else r et u r n f a l s e ;
}
27 public class KontoApl4 extends A p p l e t {
28
Konto knt1 , k nt 2 ;
29
public void i n i t ( ) {
30
k nt 1 =new Konto ( 2 0 0 ) ;
31
k nt 2 =new Konto ( 4 0 0 ) ;
32
k nt 1 . p r z e l e j D o ( knt2 , 1 0 0 ) ;
33
}
34
public void p a i n t ( Graphics g ) {
35
g . d r a w S t r i n g ( "Saldo konta1 :"+ k nt 1 . s aldo ( ) , 1 0 , 3 0 ) ;
36
g . d r a w S t r i n g ( "Saldo konta2 :"+ k nt 2 . s aldo ( ) , 1 0 , 5 0 ) ;
37
}
38 }
⊳ 72 ⊲
Jezyk
˛
Java
Dziedziczenie (1)
Deklarujac
˛ nowa˛ klase˛ obiektów można
sie˛ oprzeć na istniejacych
˛
już definicjach
klas, dodajac
˛ jedynie nowe elementy
(zmienne, metody) do już zdefiniowanych.
15
16
17
24
25
⊙
13
14
Cezary Bolek <[email protected]>
⊙
⊳ 73 ⊲
Dziedziczenie (2)
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Konto {
/ / nadklasa
p r i v a t e double kwota ;
double s aldo ( ) {
r etu r n kwota ;
}
public void wplac ( double k ) {
kwota+=k ;
}
public boolean wyplac ( double k ) {
i f ( kwota−k <0) r etu r n f a l s e ;
kwota−=k ; r etu r n tr u e ;
}
}
class KontoStandard extends Konto { / / podklasa
public boolean p r z e l e j D o ( Konto knt , double k ) {
i f ( wyplac ( k + 1 . 2 ) ) {
k n t . wplac ( k ) ;
r etu r n tr u e ;
}
else r etu r n f a l s e ;
}
}
class KontoVIP extends Konto { / / podklasa
boolean p r z e l e j D o ( Konto knt , double k ) {
i f ( wyplac ( k ) ) {
k n t . wplac ( k ) ;
r etu r n tr u e ;
}
else r etu r n f a l s e ;
}
}
⊙
⊳ 74 ⊲
Klasy pochodne
(KontoStandard, KontoVIP)
dziedzicza˛ wszystkie
zmienne i metody z nadklasy
(klasy bazowej).
class Konto {
p r i v a t e double kwota ;
double s al do ( ) . . .
public void wplac ( double k ) { . . . }
public boolean wyplac ( double k ) { . . . } }
class KontoStandard extends Konto {
public boolean p r z e l e j D o ( Konto knt , double k ) { . . . } }
class KontoVIP extends Konto {
public boolean p r z e l e j D o ( Konto knt , double k ) { . . . } }
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class KontoApl5 extends A p p l e t {
KontoStandard k nt1 ;
KontoVIP k nt2 ;
public void i n i t ( ) {
k nt1 =new KontoStandard ( ) ;
k nt2 =new KontoVIP ( ) ;
k nt1 . wplac ( 4 0 0 ) ; k nt2 . wplac ( 3 0 0 ) ;
k nt1 . p r z e l e j D o ( knt2 , 1 0 0 ) ;
k nt2 . p r z e l e j D o ( knt1 , 1 0 0 ) ;
}
public void p a i n t ( Graphics g ) {
g . d r a w S t r i n g ( "Saldo konta1 :"+ k nt1 . s al do ( ) , 1 0 , 3 0 ) ;
g . d r a w S t r i n g ( "Saldo konta2 :"+ k nt2 . s al do ( ) , 1 0 , 5 0 ) ;
}
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Klasy pochodne moga˛
korzystać bezpośrednio z
elementów odziedziczonych
z nadklasy pod warunkiem,
że nie zostały one opatrzone
specyfikatorem private.
⊙
⊳ 75 ⊲
Przesłanianie metod
Odwoływanie sie˛ do przesłonietych
˛
składowych – super
4
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Konto {
/ / nadklasa
}
class KontoStandard extends Konto { / / podklasa
public boolean wyplac ( double k ) {
i f ( kwota−k − .5<0) r et u r n f a l s e ;
kwota−=k + . 5 ; r et u r n t r u e ;
}
}
public class KontoApl6 extends A p p l e t {
Konto k nt1 ;
KontoStandard k nt2 ;
public void i n i t ( ) {
k nt1 =new Konto ( ) ; k nt2 =new KontoStandard ( ) ;
k nt1 . wplac ( 4 0 0 ) ; k nt1 . wyplac ( 1 0 0 ) ;
k nt2 . wplac ( 4 0 0 ) ; k nt2 . wyplac ( 1 0 0 ) ;
}
public void p a i n t ( Graphics g ) {
g . d r a w S t r i n g ( "Konto 1: "+ k nt1 . s al do ( ) , 1 0 , 3 0 ) ;
g . d r a w S t r i n g ( "Konto 2: "+ k nt2 . s al do ( ) , 1 0 , 6 0 ) ;
}
}
Jezyk
˛
Java
public boolean wyplac ( double k ) {
i f ( kwota−k <0) r et u r n f a l s e ;
kwota−=k ; r et u r n t r u e ;
}
4
5
W celu odwołania sie˛ w podklasie do
przesłonietej
˛ składowej nadklasy (zmiennej
lub metody) należy posłużyć sie˛ słowem
super.
Jeżeli w hierarchii klas,
metoda w podklasie ma
taka˛ sama˛ nazw˛e,
parametry i zwracany typ
jak metoda w nadklasie, to
przesłania ona metode˛
nadklasy.
6
7
8
9
10
Słowo super może być też służyć do
wywołania w konstruktorze podklasy
konstruktora nadklasy innego niż domyślny.
11
12
13
14
28
29
30
31
32
33
34
35
36
37
38
39
40
public class KontoApl7 extends A p p l e t {
Konto k nt1 ;
KontoSpecjalne k nt2 ;
public void i n i t ( ) {
k nt1 =new Konto ( 0 ) ;
k nt2 =new KontoSpecjalne ( ) ;
k nt1 . wplac ( 4 0 0 ) ; k nt1 . wyplac ( 1 0 0 ) ;
k nt2 . wplac ( 4 0 0 ) ; k nt2 . wyplac ( 1 0 0 ) ;
}
public void p a i n t ( Graphics g ) {
g . d r a w S t r i n g ( "Konto 1: "+
k nt1 . s al do ( ) , 1 0 , 3 0 ) ;
g . d r a w S t r i n g ( "Konto 2: "+
15
16
17
18
19
20
21
22
23
24
25
26
27
class Konto {
p r i v a t e double kwota ;
Konto ( double k ) {
kwota=k ;
}
double s al do ( ) {
r et u r n kwota ;
}
public void wplac ( double k ) {
kwota+=k ;
}
public boolean wyplac ( double k ) {
i f ( kwota−k <0) r et u r n f a l s e ;
kwota−=k ; r et u r n t r u e ;
}
}
class KontoSpecjalne extends Konto {
KontoSpecjalne ( ) {
super ( 5 ) ;
}
public boolean wyplac ( double k ) {
r et u r n super . wyplac ( k + . 5 ) ;
}
}
Cezary Bolek <[email protected]>
⊙
⊳ 76 ⊲
Jezyk
˛
Java
Dziedzicznie – przykład
Cezary Bolek <[email protected]>
⊙
⊳ 77 ⊲
Dynamiczne przydzielanie metody – polimorfizm
Jeżeli w hierarchii klas wystepuj
˛
˛ a przesłoniete
˛ metody, to wykonywana jest metoda
odpowiednia dla typu obiektu wywołujacego.
˛
Możliwe jest rozszerzanie klasy, która jest
podklasa˛ innej istniejacej
˛ nadklasy.
W takiej sytuacji dana podklasa staje sie˛
nadklasa˛ dla klasy, która po niej dziedziczy.
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class BazaApl extends A p p l e t {
public void p a i n t ( Graphics g ) {
Dimension d= g e t S i z e ( ) ;
g . s e t C o l o r ( Col or . y e l l o w ) ;
g . f i l l R e c t ( 1 0 , 1 0 , d . width −20,d . h e i g h t − 20);
}
}
public class TestApl1 extends BazaApl {
public void p a i n t ( Graphics g ) {
super . p a i n t ( g ) ;
g . s e t C o l o r ( Col or . b l a c k ) ;
g . d r a w S t r i n g ( "Jestem apletem TestApl1" , 1 0 , 2 0 ) ;
}
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
4 class Konto {
/ / nadklasa
19
5
p r i v a t e double kwota ;
20
6
double s aldo ( ) {
21
7
r etu r n kwota ;
22
8
}
23
9
public void wplac ( double k ) {
24
10
kwota+=k ;
25
11
}
26
12
public boolean wyplac ( double k ) {
27
13
i f ( kwota−k <0) r etu r n f a l s e ;
28
14
kwota−=k ; r etu r n tr u e ;
29
15
}
30
16
public boolean p r z e l e j D o ( Konto knt , double k ) { 31
17
r etu r n f a l s e ;
32
18
}
33
⊙
⊳ 78 ⊲
36 public class KontoApl8 extends A p p l e t {
37
Konto knt1 , k nt 2 ;
38
public void i n i t ( ) {
39
k nt 1 =new KontoStandard ( ) ; k nt 1 . wplac ( 3 0 0 ) ;
40
k nt 2 =new KontoVIP ( ) ;
k nt 2 . wplac ( 3 0 0 ) ;
41
k nt 1 . p r z e l e j D o ( knt2 , 1 0 0 ) ; k nt 2 . p r z e l e j D o ( knt1 , 1 0 0 ) ;
42
}
43
public void p a i n t ( Graphics g ) {
44
g . d r a w S t r i n g ( "Saldo konta1 :"+ k nt 1 . s aldo ( ) , 1 0 , 3 0 ) ;
45
g . d r a w S t r i n g ( "Saldo konta2 :"+ k nt 2 . s aldo ( ) , 1 0 , 5 0 ) ;
46
}
47 }
Jezyk
˛
Java
Cezary Bolek <[email protected]>
}
class KontoStandard extends Konto { / / podklasa
public boolean p r z e l e j D o ( Konto knt , double k ) {
i f ( wyplac ( k + 1 . 2 ) ) {
k n t . wplac ( k ) ;
r etu r n tr u e ;
} else r etu r n f a l s e ;
}
}
class KontoVIP extends Konto { / / podklasa
public boolean p r z e l e j D o ( Konto knt , double k ) {
i f ( wyplac ( k ) ) {
k n t . wplac ( k ) ;
r etu r n tr u e ;
} else r etu r n f a l s e ;
⊙
⊳ 79 ⊲
Metody i klasy abstrakcyjne
Zapobieganie przesłanianiu i dziedziczeniu
W jezyku
˛
Java możliwe jest definiowanie klas, których wyłacznym
˛
przeznaczeniem jest ich późniejsze dziedziczenie. Klasy takie nosza˛ nazw˛e
klas abstrakcyjnych.
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ab st r act class Konto {
/ / nadklasa
p r i v a t e double kwota ;
double s al do ( ) {
r et u r n kwota ;
}
public void wplac ( double k ) {
kwota+=k ;
}
public boolean wyplac ( double k ) {
i f ( kwota−k <0) r et u r n f a l s e ;
kwota−=k ; r et u r n t r u e ;
}
ab st r act boolean p r z e l e j D o ( Konto knt , double k ) ;
}
W celu oznaczenia klasy jako
abstrakcyjnej należy słowo
class poprzedzić deklaracja˛
abstract.
W klasach abstrakcyjnych można
zdefiniować metody
abstrakcyjne, czyli metody, które
w danej klasie nie posiadaja˛
definicji i musza˛ zostać
zdefiniowane (przesłoniete)
˛
w
klasach pochodnych.
Aby zapobiec przesłanianiu metody w klasach pochodnych należy poprzedzić
deklaracje metody słowem final.
Analogicznie można zabronić dziedziczenia danej klasy – poprzedzenie
deklaracji klasy słowem final.
4
5
6
7
8
9
10
11
12
Cezary Bolek <[email protected]>
f i n a l class KontoStandard extends Konto { / / podklasa
public boolean p r z e l e j D o ( Konto knt , double k ) {
21
// ...
class KontoNowe extends Konto {
public double s al do ( ) { / / Blad !
...
}
class KontoStandardNowe extends KontoStandard { / / Blad !
⊙
⊳ 80 ⊲
Jezyk
˛
Java
Interfejsy
Cezary Bolek <[email protected]>
⊙
⊳ 81 ⊲
Interfejsy – przykład
W jezyku
˛
Java istnieje możliwość wyabstrahowania interfejsu klasy z jej
implementacji. Definiujac
˛ interfejs wyszczególnia sie˛ co klasa ma robić nie
określajac
˛ w jaki sposób ma to być zrealizowane.
i n t e r f a c e Operacje {
double s a l d o ( ) ;
void wplac ( double k ) ;
boolean wyplac ( double k ) ;
boolean p r z e l e j D o ( Konto knt , double k ) ;
}
Zdefiniowany interfejs może implementowany przez dowolna˛ liczbe˛ klas, a
każda klasa może implementować dowolna˛ liczbe˛ interfejsów.
class Konto implements Operacje {
double s a l d o ( ) { . . . }
void wplac ( double k ) { . . . }
void wyplac ( double k ) { . . . }
boolean p r z e l e j D o ( Konto knt , double k )
{ ... }
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
19
20
class KontoStandard extends Konto {
public boolean p r z e l e j D o ( Konto knt , double k ) { . . . } }
class KontoVIP extends Konto {
public boolean p r z e l e j D o ( Konto knt , double k ) { . . . } }
Konto k nt1 =new Konto ( ) ;
/ / bl ad !
Konto k nt2 =new KontoVIP ( ) ; / / Ok
Jezyk
˛
Java
ab st r act class Konto {
/ / nadklasa
p r i v a t e double kwota ;
f i n a l public double s al do ( ) {
r et u r n kwota ;
}
f i n a l public void wplac ( double k ) {
kwota+=k ;
}
// ...
Aby zaimplementować
interfejs, klasa musi utworzyć
pełny zestaw metod przezeń
zdefiniowanych, swobodnie
określajac
˛ szczegóły
implementacji.
⊙
⊳ 82 ⊲
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
i n t e r f a c e Operacje {
34 class KontoVIP extends Konto implements O ds et k i {
double s aldo ( ) ;
35
public boolean p r z e l e j D o ( Konto knt , double k ) {
void wplac ( double k ) ;
36
i f ( wyplac ( k ) ) {
boolean wyplac ( double k ) ;
37
k n t . wplac ( k ) ;
boolean p r z e l e j D o ( Konto knt , double k ) ;
38
r etu r n tr u e ;
}
39
}
i n t e r f a c e O ds et k i {
40
else
public void k a p i t a l i z u j ( ) ;
41
r etu r n f a l s e ;
}
42
}
ab str act class Konto implements Operacje {
43
public void k a p i t a l i z u j ( ) {
p r i v a t e double kwota ;
44
wplac ( s aldo ( ) ∗ 0 . 1 ) ;
f i n a l public double s aldo ( ) {
45
}
r etu r n kwota ;
46 }
}
47 public class KontoApl11 extends A p p l e t {
public void wplac ( double k ) {
48
Konto knt1 , k nt 2 ;
kwota+=k ;
49
public void i n i t ( ) {
}
50
k nt 1 =new KontoStandard ( ) ;
public boolean wyplac ( double k ) {
51
k nt 1 . wplac ( 3 0 0 ) ;
i f ( kwota−k <0) r etu r n f a l s e ;
52
k nt 2 =new KontoVIP ( ) ;
kwota−=k ; r etu r n tr u e ;
53
k nt 2 . wplac ( 3 0 0 ) ;
}
54
i f ( k nt 1 instanceof O ds et k i )
}
55
( ( O ds et k i ) k nt 1 ) . k a p i t a l i z u j ( ) ;
class KontoStandard extends Konto {
56
i f ( k nt 2 instanceof O ds et k i )
public boolean p r z e l e j D o ( Konto knt , double k ) { 57
( ( O ds et k i ) k nt 2 ) . k a p i t a l i z u j ( ) ;
i f ( wyplac ( k + 1 . 2 ) ) {
58
}
k n t . wplac ( k ) ;
59
public void p a i n t ( Graphics g ) {
r etu r n tr u e ;
60
g . d r a w S t r i n g ( "Konto 1: "+k nt 1 . s aldo ( ) , 1 0 , 3 0 ) ;
} else r etu r n f a l s e ;
61
g . d r a w S t r i n g ( "Konto 2: "+k nt 2 . s aldo ( ) , 1 0 , 5 0 ) ;
}
62
}
}
63 }
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 83 ⊲
Wprowadzenie do modelu delegacji zdarzeń – przykład
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Obsługa zdarzeń w apletach
class Wiadomosc {
35
Bank ( S t r i n g Nazwa ) {
Wiadomosc ( S t r i n g Nad , S t r i n g Tr ) {
36
NazwaBanku=Nazwa ;
Nadawca=Nad ; Tresc =Tr ;
37
}
}
38
void dodajOdbiorce ( OdbiorcaWiad o d b i o r c a ) {
S t r i n g Nadawca ; S t r i n g Tresc ;
39
l i s t a O d b i o r c o w . add ( o d b i o r c a ) ;
}
40
}
i n t e r f a c e OdbiorcaWiad {
41
void w y s lijKom ( S t r i n g Komunikat ) {
public void nowaWiad ( Wiadomosc Komunikat ) ;
42
I t e r a t o r i t =listaOdbiorcow . i t e r a t o r ( ) ;
}
43
while ( i t . hasNext ( ) ) {
class K l i e n t implements OdbiorcaWiad {
44
OdbiorcaWiad o d b i o r c a =( OdbiorcaWiad ) i t . nex t ( ) ;
S t r i n g Nazwisko ;
45
o d b i o r c a . nowaWiad (
K l i e n t ( S t r i n g Nazw ) {
46
new Wiadomosc ( NazwaBanku , Komunikat ) ) ;
Nazwisko=Nazw ;
47
}
}
48
}
public void nowaWiad ( Wiadomosc Komunikat ) {
49 }
System . out . p r i n t l n ( Nazwisko+": "
50 class D elegac ja {
+Komunikat . Tresc +" ("+Komunikat . Nadawca+")"51
);
public s t a t i c void main ( S t r i n g args [ ] ) {
}
52
Bank PKO=new Bank ( "PKO" ) ;
}
53
Bank WBK=new Bank ( "WBK" ) ;
class Firma implements OdbiorcaWiad {
54
K l i e n t Marek=new K l i e n t ( "Marek" ) ;
S t r i n g Nazwa ;
55
K l i e n t Anna=new K l i e n t ( "Anna" ) ;
Firma ( S t r i n g Nazw ) {
56
K l i e n t Marcin=new K l i e n t ( "Marcin" ) ;
Nazwa=Nazw ;
57
Firma MPK=new Firma ( "MPK" ) ;
}
58
PKO. dodajOdbiorce ( Marek ) ;
public void nowaWiad ( Wiadomosc Komunikat ) {
59
PKO. dodajOdbiorce ( Anna ) ;
System . out . p r i n t l n ( "["+Nazwa+"]: "
60
PKO. dodajOdbiorce (MPK ) ;
+Komunikat . Tresc +" ("+Komunikat . Nadawca+")"61
);
WBK. dodajOdbiorce ( Anna ) ;
}
62
WBK. dodajOdbiorce ( Marcin ) ;
}
63
PKO. w y s lijKom ( "Promocja lokat kapital." ) ;
class Bank {
64
WBK. w y s lijKom ( "Podwyzka oprocentowania." ) ;
S t r i n g NazwaBanku ;
65
}
A r r a y L i s t l i s t a O d b i o r c o w =new A r r a y L i s t ( ) ;
66 }
˛
Java?
Czym jest zdarzenie w programowaniu w jezyku
Zdarzenie jest to wystapienie
˛
określonej sytuacji zdefiniowanej przez
środowisko uruchomieniowe, np. naciśniecie
˛
klawisza myszki, przesuniecie
˛
okna, upłyniecie
˛
interwału czasowego itp.
Java poczawszy
˛
od wersji 1.1 system obsługi zdarzeń oparty jest na
W jezyku
˛
modelu delegacji zdarzeń, który opiera sie˛ na schemacie:
• Źródło generuje zdarzenie i wysyła je do do jednego lub kilku odbiorników
• Odbiornik oczekuje na zdarzenie
• Po otrzymaniu zdarzenia odbiornik przetwarza je
W modelu delegacji zdarzeń odbiorniki musza˛ zarejestrować sie˛ w źródle (lub
źródłach) w celu otrzymywania powiadomienia o zdarzeniu. Dzieki
˛ temu bed
˛ a˛
one otrzymywać tylko powiadomienia o zdarzeniach, które sa˛ subskrybowane.
⊙
⊳ 84 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Model delegacji zdarzeń (1)
• naciśniecie
˛
przycisku myszy lub klawiatury
• wybranie przycisku na ekranie
• Źródła zdarzeń
musza˛ zarejestrować odbiorniki, by
mogły one otrzymywać
powiadomienia. Każdy typ zdarzenia
ma własna˛ metode˛ rejestracji:
addTypListener(TypListener el)
• Odbiorniki zdarzeń
sa˛ to obiekty powiadamiane przy
wystapieniu
˛
zdarzenia. Musza˛ one
implementować metody odbierajace
˛ i
przetwarzajace
˛ komunikaty o
zdarzeniach. Metody te zdefiniowane
sa˛ przez predefiniowane interfejsy:
interface TypListener
• wybranie pozycji z listy itp.
Zdarzenia moga˛ być też generowane bez udziału użytkownika, np:
• po upłynieciu
˛
interwału czasu
• przekroczeniu przez licznik określonej wartości
• wystapienia
˛
błedu
˛
oprogramowania itp.
• Klasy zdarzeń
Odbiornik zdarzenia odbiera kopie˛
obiektu odpowiedniego typu
zawierajacego
˛
informacje o
zdarzeniu: class TypEvent
Można też dowolnie definiować i generować zdarzenia samodzielnie.
Cezary Bolek <[email protected]>
⊳ 85 ⊲
Model delegacji zdarzeń (2)
W modelu delegacji zdarzenie to obiekt opisujacy
˛ zmiane˛ stanu źródła. Może
on zostać wygenerowany w wyniku skorzystania przez użytkownika z
elementu interfejsu graficznego, np:
Jezyk
˛
Java
⊙
⊙
⊳ 86 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class I n t e r f A p l 1 extends A p p l e t
implements MouseListener {
S t r i n g s t r =new S t r i n g ( ) ;
public void i n i t ( ) {
addMouseListener ( t h i s ) ;
}
public void mouseClicked ( MouseEvent e ) {
s t r ="mouseClicked" ; r e p a i n t ( ) ;
}
public void mouseEntered ( MouseEvent e ) {
s t r ="mouseEntered" ; r e p a i n t ( ) ;
}
public void mouseExited ( MouseEvent e ) {
s t r ="mouseExited" ; r e p a i n t ( ) ;
}
public void mousePressed ( MouseEvent e ) {
s t r ="mousePressed" ; r e p a i n t ( ) ;
}
public void mouseReleased ( MouseEvent e ) {
s t r ="mouseReleased" ; r e p a i n t ( ) ;
}
public void p a i n t ( Graphics g ) {
g . drawString ( str , 1 0 , 2 0 ) ;
}
}
⊙
⊳ 87 ⊲
Interfejsy odbiorników zdarzeń oraz klasy zdarzeń (1)
Interfejsy odbiorników zdarzeń oraz klasy zdarzeń (2)
Interfejs MouseListener definiuje pieć
˛ metod zwiazanych
˛
z naciśnieciami
˛
przycisków myszy:
•
•
•
•
•
void
void
void
void
void
Klasa reprezentujaca
˛ zdarzenia zwia˛
zane z mysza:
˛
mouseClicked(MuseEvent me) – klikniecie
˛
mysza˛ komponentu
mouseEntered(MuseEvent me) – najazd myszy na obszar komponentu
mouseExited(MuseEvent me) – opuszczenie myszy obszary komponentu
mousePressed(MuseEvent me) – naciśniecie
˛
klawisza myszy
mouseReleased(MuseEvent me) – zwolnienie klawisza myszy
MouseEvent
Wybrane metody klasy:
• int getX() – zwraca współrz˛edna˛ ’x’ kursora myszy w chwili
wystapienia
˛
zdarzenia
• int getY() – zwraca współrz˛edna˛ ’y’
• int getButton() – zwraca
identyfikator naciśnietego
˛
klawisza:
⋆ MouseEvent.BUTTON1 –
lewy przycisk myszy
⋆ MouseEvent.BUTTON2 –
prawy przycisk myszy
Metoda rejestrujaca
˛ komponent jako odbiornik zdarzeń:
void addMouseListener(MouseListener lm)
Interfejs MouseMotionListener definiuje dwie metody zwiazanych
˛
z
przesuwaniem kursora myszy:
• void mouseMoved(MuseEvent me) – wywołana wielokrotnie przy każdym
przesunieciu
˛
myszy
• void mouseDragged(MuseEvent me) – wywołana wielokrotnie przy każdym
przeciaganiu
˛
myszy
Metoda rejestrujaca
˛ komponent jako odbiornik zdarzeń:
void addMouseMotionListener(MouseListener ml)
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 88 ⊲
Jezyk
˛
Java
Interfejsy odbiorników zdarzeń oraz klasy zdarzeń (3)
5 public class I n t e r f A p l 2 extends A p p l e t
6
implements MouseListener , MouseMotionListener {
7
i n t x , y , dx , dy ;
8
boolean l p ;
9
public void i n i t ( ) {
10
addMouseListener ( t h i s ) ;
11
addMouseMotionListener ( t h i s ) ;
12
}
13
public void mousePressed ( MouseEvent e ) {
14
i f ( e . g e t B u t t o n ( ) = = MouseEvent . BUTTON1)
15
l p = tr u e ;
16
else
17
lp=false ;
18
x=e . getX ( ) ; y=e . getY ( ) ; dx=dy =0;
19
repaint ( ) ;
20
}
21
public void mouseDragged ( MouseEvent e ) {
22
dx=e . getX () − x ;
23
dy=e . getY () − y ;
24
repaint ( ) ;
25
}
26
public void p a i n t ( Graphics g ) {
27
i f ( l p ) g . drawOval ( x , y , dx , dy ) ;
28
else g . f i l l O v a l ( x , y , dx , dy ) ;
29
}
30
public void mouseReleased ( MouseEvent e ) { }
31
public void mouseClicked ( MouseEvent e ) { }
32
public void mouseEntered ( MouseEvent e ) { }
33
public void mouseExited ( MouseEvent e ) { }
34
public void mouseMoved ( MouseEvent e ) { }
35 }
Cezary Bolek <[email protected]>
⊙
⊳ 89 ⊲
Interfejsy odbiorników zdarzeń oraz klasy zdarzeń (4)
5
6
Interfejs KeyListener definiuje trzy metody zwiazanych
˛
z klawiatura:
˛
• void keyPressed(KeyEvent me) – klikniecie
˛
mysza˛ komponentu
• void keyReleased(KeyEvent me) – najazd myszy na obszar komponentu
• void keyTypedKey(KeyEvent me) – opuszczenie myszy obszary komponentu
Metoda rejestrujaca
˛ komponent jako odbiornik zdarzeń:
void addKeyListener(KeyListener lm)
11
12
13
16
17
KeyEvent
18
19
20
Wybrane metody klasy:
21
22
• char getKeyChar() – zwraca znak reprezentujacy
˛ naciśniety
˛ klawisz
• int getKeyCode() – zwraca kod naciśnietego
˛
klawisza, np:
⋆ KeyEvent.VK UP – kursor do góry
⋆ KeyEvent.VK HOME – klawisz ’Home’
⋆ KeyEvent.VK ALT – klawisz ’Shift’
Cezary Bolek <[email protected]>
9
10
14
15
Klasa reprezentujaca
˛ zdarzenia zwiazane
˛
z klawiatura:
˛
Jezyk
˛
Java
7
8
23
24
25
26
27
28
29
⊙
⊳ 90 ⊲
public class I n t e r f A p l 3 extends A p p l e t
implements K e y L i s t e n e r {
i n t x =10 , y =20;
S t r i n g s t r =new S t r i n g ( "Tekst" ) ;
public void i n i t ( ) {
addK ey Li s tener ( t h i s ) ;
requestFocus ( ) ;
}
public void keyTyped ( KeyEvent ke ) {
s t r +=ke . getKeyChar ( ) ;
repaint ( ) ;
}
public void keyPressed ( KeyEvent ke ) {
i n t code=ke . getKeyCode ( ) ;
i f ( code==KeyEvent . VK_UP ) y−−;
i f ( code==KeyEvent .VK_DOWN) y ++;
i f ( code==KeyEvent . VK_LEFT ) x−−;
i f ( code==KeyEvent . VK_RIGHT ) x ++;
repaint ( ) ;
}
public void keyReleased ( KeyEvent ke ) { }
public void p a i n t ( Graphics g ) {
g . drawString ( str , x , y ) ;
}
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 91 ⊲
Inne klasy i interfejsy odbiorników zdarzeń (1)
Inne klasy i interfejsy odbiorników zdarzeń (2)
• Klasa ActionEvent – zdarzenie generowane, gdy zostanie wciśniety
˛
przycisk, dwukrotnie kliknieta
˛ pozycja listy lub wybrana pozycja menu.
Interfejs odbiornika zdarzeń:
Rejestracja odbiornika zdarzeń:
ActionListener
void addActionListener(ActionListener al)
• Klasa AdjustmentEvent – zdarzenie generowane przez paski przewijania.
AdjustmentListener
Interfejs:
Rejestracja: void addAdjustmentListener(AdjustmentListener al)
usuwaniu komponentu z kontenera (np. przycisku z okna apletu).
ContainerListener
void addContainerListener(ContainerListener al)
• Klasa TextEvent – zdarzenie generowane przez pola i obszary tekstowe
(np. okna edycyjne), gdy użytkownik lub program wprowadza do nich znaki.
Interfejs:
Rejestracja:
WindowListener
void addWindowListener(WindowListener al)
FocusListener
void addFocusListener(FocusListener al)
Cezary Bolek <[email protected]>
⊙
⊳ 92 ⊲
Jezyk
˛
Java
Kontrolki
AWT zawiera nastepuj
˛ ace
˛ rodzaje kontrolek:
• Etykiety (ang. labels)
• Przyciski (ang. push buttons)
• Pola wyboru (ang. check boxes)
• Listy opcji (ang. choice lists)
⊙
⊳ 93 ⊲
Utworzenia nowej kontrolki – wywołanie jej
konstruktora.
Aby kontrolka (komponent) pojawiła sie˛ w
kontenerze (okno apletu jest kontenerem)
należy ja˛ do niego dodać za pomoca˛
metody:
Container add(Component c)
Usuniecie
˛
kontrolki:
void remove(Component c)
5
6
7
8
9
10
11
12
13
14
15
public class K ontr A pl 1 extends A p p l e t {
Konto knt1 , k nt2 ;
public void i n i t ( ) {
k nt1 =new KontoStandard ( 1 0 0 ) ;
k nt2 =new KontoVIP ( 2 0 0 ) ;
S t r i n g s t r = k nt1 . s al do ( ) + " zl" ;
Label l b l =new Label ( s t r ) ;
add ( l b l ) ;
add ( new Label ( k nt2 . s al do ( ) + " zl" ) ) ;
}
}
Etykieta (Label) jest najprostsza˛ kontrolka˛ –
służy do wyświetlania ciagu
˛ znaków.
Etykieta jest kontrolka˛ pasywna˛ i nie
umożliwia żadnej interakcji.
Przykładowe metody klasy Label:
• Listy (ang. (ang. choice list)
• Paski przewijania (ang. scroll bars)
• Pola tekstowe (ang. text editing)
Wszystkie kontrolki, oprócz pasywnych etykiet, generuja˛ zdarzenia, gdy
użytkownik z nich korzysta. Aby odbierać zdarzenia w danej klasie należy
zaimplementować w niej odpowiedni interfejs i zarejestrować odbiornik
zdarzeń dla każdej kontrolki, która ma być monitorowana.
Cezary Bolek <[email protected]>
Cezary Bolek <[email protected]>
Etykiety (klasa Label)
Kontrolki sa˛ to gotowe komponenty biblioteczne pozwalajace
˛ użytkownikowi
na interakcje z programem.
Jezyk
˛
Java
TextListener
void addTextListener(TextListener al)
takich jak np: minimalizacja, aktywacja, deaktywacja itp.
traci ognisko (focus).
Jezyk
˛
Java
ItemListener
void addItemListener(ItemListener al)
• Klasa WindowEvent – zdarzenie generowane przy zmianach stanu okna,
• Klasa FocusEvent – zdarzenie generowane, gdy komponent uzyskuje lub
Interfejs:
Rejestracja:
Interfejs odbiornika zdarzeń:
Rejestracja odbiornika zdarzeń:
Interfejs:
Rejestracja:
• Klasa ContainerEvent – zdarzenie generowane przy dodawaniu lub
Interfejs:
Rejestracja:
• Klasa ItemEvent – zdarzenie generowane w wyniku klikniecia
˛
pola wyboru
lub pozycji listy oraz w wyniku zaznaczenia pozycji menu, która˛ można
zaznaczać.
⊙
⊳ 94 ⊲
• void setText(String str) – ustawienie
zawartości etykiety
• void setAlignment(int al) – ustawienie
wyrównania tekstu (Label.LEFT,
Label.RIGHT, Label.CENTER)
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 95 ⊲
Przyciski (klasa Button)
Utworzenie przycisku – wywołanie
konstruktora:
Button() lub Button(String str)
Każde naciśniecie
˛
generuje
zdarzenie ActionEvent wysyłane
do zarejestrowanych odbiorników.
Odbiornik implementuje interfejs
ActionListener. W momencie
wystapienia
˛
zdarzenia
wywoływana jest metoda:
actionPerformed(ActioneEvent ae)
Obiekt ActionEvent zawiera
referencje˛ do przycisku, który
wywołał zdarzenie:
• Object getSource() – zwraca
referencje˛ na obiekt
wywołujacy
˛ zdarzenie
• String getActionCommand() –
zwraca łańcuch identyfikujacy
˛
przycisk (jego etykiete)
˛
Jezyk
˛
Java
Pola wyboru (klasa Checkbox)
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class K ontr A pl 2 extends A p p l e t
implements A c t i o n L i s t e n e r {
Konto k n t ;
Label l b l K o n t o ;
B utton btnWplac , btnWyplac ;
public void i n i t ( ) {
k n t =new KontoStandard ( ) ;
l b l K o n t o =new Label ( k n t . s al do ( ) + " zl" ) ;
add ( l b l K o n t o ) ;
btnWplac =new B utton ( "Wpłać" ) ;
btnWplac . a d d A c t i o n L i s t e n e r ( t h i s ) ;
add ( btnWplac ) ;
btnWyplac=new B utton ( "Wypłać" ) ;
btnWyplac . a d d A c t i o n L i s t e n e r ( t h i s ) ;
add ( btnWyplac ) ;
}
public void ac ti onP er fo r m e d ( A c t i o n E v e n t ae ) {
i f ( ae . getSource ( ) = = btnWplac )
k n t . wplac ( 1 0 0 ) ;
else
k n t . wyplac ( 5 5 ) ;
l b l K o n t o . s e t T e x t ( k n t . s al do ( ) + " zl" ) ;
}
}
Cezary Bolek <[email protected]>
⊙
Kontrolka pozwalajaca
˛
właczyć/wył
˛
aczyć
˛
opcje.
˛
Odbiornik zdarzenia musi
implementować interfejs
Itemlistener. Naciśniecie
˛
pola
wyboru wywołuje metode:
˛
itemStateChanged(ItemEvent ie).
Metody klasy Checkbox:
•
•
•
•
5
6
7
8
9
10
11
12
13
14
15
boolean getState()
void setState(boolean on)
16
17
String getLabel()
18
19
void setLabel(String str)
20
21
22
23
24
25
26
27
28
⊳ 96 ⊲
Jezyk
˛
Java
public class K ontr A pl 3 extends A p p l e t
implements I t e m L i s t e n e r {
double cena =200;
Label l bl Cena ;
Checkbox chkPodatek , chkClo ;
public void i n i t ( ) {
l bl Cena =new Label ( ) ;
chkPodatek =new Checkbox ( "Podatek" , t r u e ) ;
chkClo =new Checkbox ( "Clo" , f a l s e ) ;
add ( l bl Cena ) ; add ( chkPodatek ) ; add ( chkClo ) ;
chkPodatek . a d d I t e m L i s t e n e r ( t h i s ) ;
chkClo . a d d I t e m L i s t e n e r ( t h i s ) ;
pokazCene ( ) ;
}
public void itemStateChanged ( ItemEvent ae ) {
pokazCene ( ) ;
}
void pokazCene ( ) {
double m ul t =1;
i f ( chkPodatek . g e t S t a t e ( ) ) m ul t + = . 2 2 ;
i f ( chkClo . g e t S t a t e ( ) ) m ul t + = . 2 0 ;
l bl Cena . s e t T e x t ( cena∗ m ul t +" zl" ) ;
}
}
Cezary Bolek <[email protected]>
⊙
⊳ 97 ⊲
Opcje (klasa Choice)
Grupa pól wyboru (klasa CheckboxGroup)
Kontrolki Pól wybory można
grupować tworzac
˛ zestaw
wzajemnie wykluczajacych
˛
sie˛ pól
wyboru.
Należy utworzyć obiekt typu
CheckboxGroup i wywołać
konstruktor klasy Checkbox:
public Checkbox(String label,
boolean state,
CheckboxGroup group)
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Label l bl Cena ;
Checkbox chkVAT0 , chkVAT7 , chkVAT22 ;
CheckboxGroup cbg ;
public void i n i t ( ) {
l bl Cena =new Label ( ) ;
cbg=new CheckboxGroup ( ) ;
chkVAT0=new Checkbox ( "VAT 0%" , cbg , f a l s e ) ;
chkVAT7=new Checkbox ( "VAT 7%" , cbg , f a l s e ) ;
chkVAT22=new Checkbox ( "VAT 22%" , cbg , t r u e ) ;
add ( l bl Cena ) ;
add ( chkVAT0 ) ; add ( chkVAT7 ) ; add ( chkVAT22 ) ;
chkVAT0 . a d d I t e m L i s t e n e r ( t h i s ) ;
chkVAT7 . a d d I t e m L i s t e n e r ( t h i s ) ;
chkVAT22 . a d d I t e m L i s t e n e r ( t h i s ) ;
pokazCene ( ) ;
}
public void itemStateChanged ( ItemEvent ae ) {
pokazCene ( ) ;
}
void pokazCene ( ) {
double m ul t =1;
i f ( chkVAT7 . g e t S t a t e ( ) ) m ul t + = . 0 7 ;
else i f ( chkVAT22 . g e t S t a t e ( ) ) m ul t + = . 2 2 ;
l bl Cena . s e t T e x t ( cena∗ m ul t +" zl" ) ;
}
⊙
⊳ 98 ⊲
Kontrolka umożliwiajaca
˛ tworzenie
listy opcji, z której można wybrać
jedna˛ pozycje.
˛
Wybrane metody klasy Choice:
•
•
•
•
•
void add(String str)
String getSelectedItem()
int getSelectedIndex()
int getItemCount()
void select(int index)
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Jezyk
˛
Java
Cezary Bolek <[email protected]>
public class K ontr A pl 5 extends A p p l e t
implements I t e m L i s t e n e r {
double cena =200;
Label l bl Cena ;
Choice chcVAT ;
public void i n i t ( ) {
l bl Cena =new Label ( ) ;
chcVAT=new Choice ( ) ;
chcVAT . add ( "VAT 0%" ) ; chcVAT . add ( "VAT 7%" ) ;
chcVAT . add ( "VAT 22%" ) ; chcVAT . s e l e c t ( 2 ) ;
add ( l bl Cena ) ; add ( chcVAT ) ;
chcVAT . a d d I t e m L i s t e n e r ( t h i s ) ;
pokazCene ( ) ;
}
public void itemStateChanged ( ItemEvent ae ) {
pokazCene ( ) ;
}
void pokazCene ( ) {
double m ul t =1;
i n t poz=chcVAT . g e t S e l e c t e d I n d e x ( ) ;
i f ( poz ==1) m ul t + = . 0 7 ;
else i f ( poz ==2) m ul t + = . 2 2 ;
l bl Cena . s e t T e x t ( cena∗ m ul t +" zl" ) ;
}
}
⊙
⊳ 99 ⊲
Lista (klasa List)
Pole tekstowe (klasa TextField)
Kontrolka umożliwiajaca
˛ tworzenie
przewijanych list, pozwalajacych
˛
wybór kilku lub jednej pozycji.
6 public class Kont rApl6 extends A p p l e t
7
implements I t e m L i s t e n e r {
8
Label l b l S a l d o ;
9
j a v a . awt . L i s t l s t K o n t a ;
10
Bank PKO=new Bank ( ) ;
11
public void i n i t ( ) {
12
l b l S a l d o =new Label ( "nic nie znazaczono" ) ;
13
l s t K o n t a =new j a v a . awt . L i s t ( 5 ) ;
14
f o r ( i n t n =0; n <100; n++) {
15
Konto k n t ;
16
i f ( n%2==0)
17
k n t =new KontoStandard ( n%5∗100);
18
else
19
k n t =new KontoVIP ( n%5∗100);
20
PKO. dodajKonto ( k n t ) ;
21
l s t K o n t a . add ( k n t . nrKonta ( ) ) ;
22
}
23
add ( l s t K o n t a ) ;
24
add ( l b l S a l d o ) ;
25
lstKonta . addItemListener ( this ) ;
26
}
27
public void itemStateChanged ( ItemEvent ae ) {
28
i n t poz= l s t K o n t a . g e t S e l e c t e d I n d e x ( ) ;
29
i f ( poz <0) r etu r n ;
30
A r r a y L i s t a l =PKO. l i s t a K o n t ( ) ;
31
Konto k n t =( Konto ) a l . get ( poz ) ;
32
l b l S a l d o . s e t T e x t ( k n t . s aldo ( ) + " zl" ) ;
33
}
34 }
Przy stosowaniu pojedynczej
pozycji wyboru metody stosowania
analogiczne jak dla klasy Choice.
Odbiornik zdarzeń klasy List musi
implementować jeden z
interfejsów: ItemListener (działanie
jak dla Choice), lub ActionListener
(podwójne klikniecie
˛
pozycji listy).
Kontrolka edycyjna umożliwiajaca
˛
wprowadzanie pojedynczej linii
tekstu.
Odbiornik zdarzeń klasy List musi
implementować jeden z
interfejsów: ActionListener
(naciśniecie
˛
klawisza ENTER), lub
TextListener (zmiana stanu pola
tekstowego).
Wybrane metody klasy TextField:
• String getText()
• void setText(String str)
5 public class Kont rApl7 extends A p p l e t
6
implements A c t i o n L i s t e n e r , T e x t L i s t e n e r {
7
double kwota ; Konto k n t ; Label l b l S a l d o , l b l K w o t a ;
8
But t on btnWyplac ; T e x t F i e l d t f dKw ot a ;
9
public void i n i t ( ) {
10
k n t =new KontoStandard ( 1 0 0 0 ) ;
11
l b l S a l d o =new Label ( k n t . s aldo ( ) + " zł" ) ; add ( l b l S a l d o ) ;
12
t f dKw ot a =new T e x t F i e l d ( 1 0 ) ;
add ( t f dKw ot a ) ;
13
btnWyplac =new But t on ( "Wypłać" ) ;
add ( btnWyplac ) ;
14
l b l K w o t a =new Label ( "wprowadz kwot˛
e" ) ; add ( l b l K w o t a ) ;
15
btnWyplac . a d d A c t i o n L i s t e n e r ( t h i s ) ;
16
t f dKw ot a . a d d T e x t L i s t e n e r ( t h i s ) ;
17
t f dKw ot a . a d d A c t i o n L i s t e n e r ( t h i s ) ;
18
}
19
public void textValueChanged ( TextEvent t e ) {
20
String str ;
21
try {
22
kwota=Double . parseDouble ( t f dKw ot a . g e t T e x t ( ) ) ;
23
i f ( kwota <=0 | | kwota> k n t . s aldo ( ) ) {
24
kwota =0; s t r ="niewłasciwa kwota" ;
25
} else s t r =kwota+" zł" ;
26
}
27
catch ( NumberFormatException e ) {
28
s t r ="zły format" ;
29
}
30
lblKwota . setText ( s t r ) ;
31
}
32
public void ac t ionPerf or m e d ( Ac t ionEv en t ae ) {
33
i f ( kwota <=0) r etu r n ;
34
k n t . wyplac ( kwota ) ;
35
l b l S a l d o . s e t T e x t ( k n t . s aldo ( ) + " zł" ) ; l b l K w o t a . s e t T e x t ( "" ) ;
36
} }
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 100 ⊲
Klasa Canvas
6
Canvas jest komponentem
reprezentujacym
˛
prostokatny
˛
obszar ekranu, na którym można
rysować i z którego można
przechwytywać zdarzenia (np.
pochodzace
˛ od myszy).
Aby skorzystać z klasy Canvas
należy utworzyć jej podklase,
˛ w
której przesłonieto
˛ metode:
˛
void paint(Graphics g)
w której należy umieścić kod
rysujacy.
˛
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 102 ⊲
⊳ 101 ⊲
Menedżery układu (1)
public class K ontr A pl 8 extends A p p l e t {
public void i n i t ( ) {
add ( new Los F i gur y ( 100 ,100 , Col or .RED, t r u e ) ) ;
add ( new Los F i gur y ( 100 ,100 , Col or .GREEN, f a l s e ) ) ;
}
}
class Los F i gur y extends Canvas {
public boolean czyKola = t r u e ;
public Los F i gur y ( i n t dx , i n t dy ,
Col or c l r , boolean czyKola ) {
ustawKola ( czyKola ) ;
i f ( dx >0 && dy >0) s e t S i z e ( dx , dy ) ;
setBackground ( c l r ) ;
}
public void ustawKola ( boolean czyKola ) {
t h i s . czyKola =czyKola ; r e p a i n t ( ) ;
}
public void p a i n t ( Graphics g ) {
Random rnd=new Random ( ) ;
Dimension dim= g e t S i z e ( ) ;
f o r ( i n t n =0; n <100; n++) {
i n t x= rnd . n e x t I n t ( dim . width − 10);
i n t y= rnd . n e x t I n t ( dim . h e i g h t − 10);
i f ( czyKola ) g . drawOval ( x , y , 1 0 , 1 0 ) ;
else g . drawRect ( x , y , 1 0 , 1 0 ) ;
}
} }
⊙
Komponenty (czyli także kontrolki) pozycjonowane sa˛ w kontenerze za
pomoca˛ menedżera układu (LayoutManager). Dla obiektów klasy Applet
domyślnie używany jest menedżer FlowLayout z ustawionym centrowaniem
komponentów.
Aby wymusić stosowanie
konkretnego menedżera układu
należy utworzyć obiekt klasy
dziedziczacej
˛ po klasie
LayoutManager i wywołać metode˛
klasy Cotainer (klasa Applet jest jej
podklasa):
˛
void setLayout(LayoutManager mngr)
FlowLayout.LEFT
5
6
7
8
9
10
11
12
13
public class MenApl1_1 extends A p p l e t {
public void i n i t ( ) {
s e t L a y o u t ( new FlowLayout ( FlowLayout . LEFT ) ) ;
add ( new B utton ( "Przycisk jeden" ) ) ;
add ( new B utton ( "Przycisk dwa" ) ) ;
add ( new B utton ( "Przycisk trzy" ) ) ;
add ( new B utton ( "Przycisk cztery" ) ) ;
}
}
FlowLayout.CENTER
FlowLayout.RIGHT
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 103 ⊲
Menedżery układu (2)
6
7
8
9
10
11
12
13
14
15
16
17
18
19
6
7
8
9
10
11
12
13
public class MenApl2 extends A p p l e t {
public void i n i t ( ) {
s e t L a y o u t ( new BorderLayout ( ) ) ;
add ( new B utton ( "North" ) ,
BorderLayout .NORTH ) ;
add ( new B utton ( "South" ) ,
BorderLayout .SOUTH ) ;
add ( new B utton ( "East" ) ,
BorderLayout . EAST ) ;
add ( new B utton ( "West" ) ,
BorderLayout .WEST ) ;
add ( new B utton ( "Center" ) ,
BorderLayout .CENTER ) ;
}
}
public void i n i t ( ) {
s e t L a y o u t ( new G r i dLay out ( 2 , 3 ) ) ;
f o r ( i n t n =1; n <=6;n++)
add ( new B utton ( "Przycisk "+n ) ) ;
}
public I n s e t s g e t I n s e t s ( ) {
r et u r n new I n s e t s ( 5 , 1 0 , 1 0 , 1 0 ) ;
}
Jezyk
˛
Java
GridLayout
5
6
7
8
9
10
11
public class MenApl3 extends A p p l e t {
public void i n i t ( ) {
s e t L a y o u t ( new G r i dLay out ( 2 , 3 ) ) ;
f o r ( i n t n =1; n <=6;n++)
add ( new B utton ( "Przycisk "+n ) ) ;
}
}
Object
Component
Canvas
Label
Klasa Insets –
ustawienie odstepu
˛
miedzy
˛
kontrolkami
a brzegami
kontenera
Frame
Window
Choice
TextComponent
List
nt
ro
lk
i
TextField
Panel
TextArea
Ap
let
Dialog
Applet
⊙
⊳ 104 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Menedżery układu (3) – Panele
Jezyk
˛
Java
Ko
Cezary Bolek <[email protected]>
Klasa Applet jest
podklasa˛ Panel, a ta
Container.
Container dysponuje
menedżerem ułożeń, co
pozwala na dodawanie
nowych komponentów
(Component).
Skoro Container (czyli i
Panel) jest podklasa˛
Component) wiec
˛ obiekty
Panel moga˛ być
dodawane do istniejacych
˛
kontenerów, same bed
˛ ac
˛
kontenerami.
Checkbox
Button
Container
Ok
na
BorderLayout
5
Hierarchia wybranych klas biblioteki AWT
⊙
⊳ 105 ⊲
Okna – (klasa Frame)
6 public class MenApl5 extends A p p l e t implements A c t i o n L i s t e n e r {
7
But t on b t n K o p i u j , bt nWk lej , btnWyczysc ;
8
TextArea t a r T e x t ;
9
S t r i n g schowek=new S t r i n g ( ) ;
10
public void i n i t ( ) {
11
s e t L a y o u t (new BorderLayout ( ) ) ;
12
Panel panel =new Panel ( ) ; panel . s e t L a y o u t (new G ridLay out ( 3 , 0 ) ) ;
13
panel . add ( b t n K o p i u j =new But t on ( "Kopiuj" ) ) ;
14
panel . add ( b t n W k l e j=new But t on ( "Wklej" ) ) ;
15
panel . add ( btnWyczysc=new But t on ( "Wyczysć" ) ) ;
16
add ( panel , BorderLayout .WEST ) ;
17
panel =new Panel ( ) ; panel . s e t L a y o u t (new BorderLayout ( ) ) ;
18
panel . add (new Label ( "Opis:" , Label .CENTER) , BorderLayout .NORTH) ;
19
panel . add ( t a r T e x t =new TextArea ( ) , BorderLayout .CENTER ) ;
20
add ( panel , BorderLayout .CENTER ) ;
21
btnKopiuj . addActionListener ( this ) ;
22
btnWklej . addActionListener ( this ) ;
23
btnWyczysc . a d d A c t i o n L i s t e n e r ( t h i s ) ;
24
}
25
public void ac t ionPerf orm ed ( Ac t ionEv en t ae ) {
26
i f ( ae . getSource ( ) = = btnWyczysc ) {
27
t a r T e x t . s e t T e x t ( "" ) ;
28
}
29
else i f ( ae . getSource ( ) = = b t n K o p i u j ) {
30
schowek= t a r T e x t . g e t S e l e c t e d T e x t ( ) ;
31
}
32
else i f ( ae . getSource ( ) = = b t n W k l e j ) {
33
t a r T e x t . i n s e r t ( schowek , t a r T e x t . g e t C a r e t P o s i t i o n ( ) ) ;
34
}
35
t a r T e x t . requestFocus ( ) ;
36
} }
Cezary Bolek <[email protected]>
⊙
⊳ 106 ⊲
W bibliotece AWT jezyka
˛
Java zaimplementowano klase˛ tworzac
˛ a˛
standardowe okno z paskiem tytułu, brzegami umożliwiajacymi
˛
zmiane˛
rozmiaru i paskiem menu.
Aby utworzyć okno należy utworzyć obiekt klasy Frame lub jej podklasy i wywołać jej metode˛
show() w celu pokazania okna na ekranie.
5
6
7
8
9
10
11
public class WindowApl1 extends A p p l e t {
public void i n i t ( ) {
Frame okno=new Frame ( "Okno" ) ;
okno . s e t S i z e ( 2 0 0 , 1 0 0 ) ;
okno . show ( ) ;
}
}
Wybrane metody klasy Frame:
• void setSize(int Width, int Height) – ustawienie rozmiaru okna (odziedziczona po
Component)
• Dimension getSize() – pobranie rozmiaru okna (odziedziczona po Component)
• void setTitle(String title) – ustawienie tytułu okna
• void show() – pokazanie okna na ekranie
• void hide() – ukrycie okna
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 107 ⊲
Okna (2)
Okna – zdarzenia
Najcz˛eściej tworzy sie˛ podklase˛ klasy Frame w celu zawarcia w niej
funkcjonalności okna. W podklasie implementuje sie˛ zachowanie okna oraz
jego interfejs użytkownika.
22
6 public class WindowApl2 extends A p p l e t
7
implements A c t i o n L i s t e n e r 23{
8
But t on btnPokaz , b t n U k r y j ;
24
9
MojeOkno okno ;
25
10
public void i n i t ( ) {
26
11
add ( btnPokaz=new But t on ( "Pokaż okno" ) ) ;
27
12
add ( b t n U k r y j =new But t on ( "Ukryj okno" ) ) ;
13
btnPokaz . a d d A c t i o n L i s t e n e r ( t h i s ) ;
28
14
btnUkryj . addActionListener ( this ) ;
29
15
okno=new MojeOkno ( ) ;
30
16
}
17
public void ac t ionPerf orm ed ( Ac t ionEv en t ae ) { 31
32
18
i f ( ae . getSource ( ) = = btnPokaz ) okno . show ( ) ;
19
else okno . hide ( ) ;
33
20
}
34
21 }
35
36
37
38
39
40
41
42
Jezyk
˛
Java
Okno wysyła zdarzenia
zwiazane
˛
z jego stanem lub
zmiana˛ stanu.
class MojeOkno extends Frame
implements A c t i o n L i s t e n e r {
B utton btnOk , btnKw ;
Los F i gur y f i g u r y ;
public MojeOkno ( ) {
super ( "Figury" ) ;
setSize (200 ,200);
s e t L a y o u t ( new BorderLayout ( ) ) ;
f i g u r y =new Los F i gur y ( 0 , 0 , Col or .YELLOW, t r u e ) ;
Panel p n l =new Panel ( ) ;
p n l . add ( btnOk=new B utton ( "Koła" ) ) ;
p n l . add ( btnKw=new B utton ( "Kwadraty" ) ) ;
btnOk . a d d A c t i o n L i s t e n e r ( t h i s ) ;
btnKw . a d d A c t i o n L i s t e n e r ( t h i s ) ;
add ( pnl , BorderLayout .NORTH ) ;
add ( f i g u r y , BorderLayout .CENTER ) ;
}
public void ac ti onP er fo r m e d ( A c t i o n E v e n t ae ) {
f i g u r y . ustawKola ( ae . getSource ( ) = = btnOk ) ;
}
}
Cezary Bolek <[email protected]>
Interfejs odbiornika zdarzeń:
WindowListener
Rejestracja odbiornika zdarzeń:
addWindowListener
Metody interfejsu WindowListener:
• windowOpened – wywoływana przy
otwieraniu okna
• windowClosed – przy zamykaniu
okna
• windowClosing – przy żadaniu
˛
zamkniecia
˛
okna
• windowIconified – przy
minimalizacji okna do ikony
• windowDeiconified – przy
przywróceniu okna ze stanu
zminimalizowanego
• windowActivated – gdy okno staje
sie˛ aktywne
• windowDeactivated – gdy okno
przestaje być aktywne
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class MojeOkno extends Frame
implements WindowListener {
public MojeOkno ( ) {
super ( "Okno" ) ;
addWindowListener ( t h i s ) ;
s e t S i z e ( 2 0 0 , 1 0 0 ) ; show ( ) ;
}
public void windowOpened ( WindowEvent we ) {
}
public void windowClosing ( WindowEvent we ) {
dispose ( ) ;
}
public void windowClosed ( WindowEvent we ) {
}
public void w i n d o w I c o n i f i e d ( WindowEvent we ) {
}
public void w i n d o w D e i c o n i f i e d ( WindowEvent we ) {
}
public void wi ndowA c ti v ated ( WindowEvent we ) {
s e t C u r s o r ( Cursor .WAIT_CURSOR ) ;
}
public void windowDeactivated ( WindowEvent we ) {
s e t C u r s o r ( Cursor .DEFAULT_CURSOR ) ;
}
}
⊙
⊳ 108 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Okna dialogowe
⊙
⊳ 109 ⊲
⊙
⊳ 111 ⊲
Menu (1)
// ....
DaneDialog d i a l o g =new DaneDialog ( t h i s ) ;
i f ( d i a l o g . czyOk ) {
t e k s t = dialog . pobierzTekst ( ) ;
repaint ( ) ;
}
// ....
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Jezyk
˛
Java
Cezary Bolek <[email protected]>
class DaneDialog extends D i a l o g
implements A c t i o n L i s t e n e r {
private TextField tfdTekst ;
p r i v a t e B utton btnOK , b t n A n u l u j ;
public boolean czyOk= f a l s e ;
public DaneDialog ( Frame wndOwner ) {
super ( wndOwner , "Wprowadz tekst" , t r u e ) ;
setSize (280 ,110);
s e t L a y o u t ( new FlowLayout ( ) ) ;
add ( t f d T e k s t =new T e x t F i e l d ( 3 0 ) ) ;
add ( btnOK=new B utton ( "Ok" ) ) ;
add ( b t n A n u l u j =new B utton ( "Anuluj" ) ) ;
btnOK . a d d A c t i o n L i s t e n e r ( t h i s ) ;
btnAnuluj . addActionListener ( this ) ;
show ( ) ;
}
public S t r i n g p o b i e r z T e k s t ( ) {
r et u r n t f d T e k s t . g e t T e x t ( ) ;
}
public void ac ti onP er fo r m e d ( A c t i o n E v e n t ae ) {
i f ( ae . getSource ( ) = = btnOK ) czyOk= t r u e ;
dispose ( ) ;
}
}
⊙
⊳ 110 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Menu (2)
12 class OknoDane extends Frame
13
implements A c t i o n L i s t e n e r ,
14
ItemListener {
15
S t r i n g t e k s t =new S t r i n g ( ) ;
16
MenuItem mnuKoniec , mnuOkrag , mnuProst ;
17
CheckboxMenuItem mnuWypeln ;
18
boolean czyOkrag=true , czyWypel= f a l s e ;
19
f i n a l i n t x =100 , y =60 , dx =50 , dy =50;
20
public OknoDane ( ) {
21
super ( "Figura" ) ;
22
setSize (250 ,150);
23
Menu menu=new Menu ( "Plik" ) ;
24
Menu submenu=new Menu ( "Figura" ) ;
25
mnuOkrag=new MenuItem ( "Okrag" ) ;
26
mnuProst=new MenuItem ( "Prostokat" ) ;
27
submenu . add ( mnuOkrag ) ;
28
submenu . add ( mnuProst ) ;
29
menu . add ( submenu ) ;
30
mnuWypeln=new CheckboxMenuItem ( "Wypelnij" ) ;
31
mnuKoniec=new MenuItem ( "Koniec" ) ;
32
menu . add ( mnuWypeln ) ;
33
menu . add ( mnuKoniec ) ;
34
MenuBar mb=new MenuBar ( ) ;
35
mb. add ( menu ) ;
36
mnuOkrag . a d d A c t i o n L i s t e n e r ( t h i s ) ;
37
mnuProst . a d d A c t i o n L i s t e n e r ( t h i s ) ;
38
mnuKoniec . a d d A c t i o n L i s t e n e r ( t h i s ) ;
39
mnuWypeln . a d d I t e m L i s t e n e r ( t h i s ) ;
40
setMenuBar (mb ) ;
41
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Koniec
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 }
public void ac t ionPerf orm e d ( Ac t ionEv e nt ae ) {
i f ( ae . getSource ( ) = = mnuKoniec )
dispose ( ) ;
else i f ( ae . getSource ( ) = = mnuOkrag )
czyOkrag= tr u e ;
else czyOkrag= f a l s e ;
repaint ( ) ;
}
public void itemStateChanged ( ItemEvent i e ) {
czyWypel=
( i e . getStateChange ( ) = = ItemEvent . SELECTED ) ;
repaint ( ) ;
}
public void p a i n t ( Graphics g ) {
i f ( czyWypel ) {
i f ( czyOkrag ) g . f i l l O v a l ( x , y , dx , dy ) ;
else g . f i l l R e c t ( x , y , dx , dy ) ;
} else {
i f ( czyOkrag ) g . drawOval ( x , y , dx , dy ) ;
else g . drawRect ( x , y , dx , dy ) ;
}
}
⊙
⊳ 112 ⊲
— Skład FoilTEX, P4 (PPower4) —
⊙