Jezyk Java - Katedra Informatyki > Home

Transkrypt

Jezyk Java - Katedra Informatyki > Home
Literatura
Plan zaje˛ ć
Jezyk
˛
Java.
• Herbert Schildt — „Programowanie. Java 2”, Wydawnictwo RM,
Warszawa 2002
1. Literatura
Cezary Bolek
[email protected]
2. Historia jezyka
˛
Java
Uniwersytet Łódzki
Katedra Informatyki
• Bruce Eckel — „Thinking in Java”
3. Podstawy programowania w jezyku
˛
Java
• S. Holzner — Java 1.2. Szybkie wprowadzenie, Wydawnictwo HELP,
Warszawa 1999
4. Programowanie obiektowe
5. Podstawy tworzenia appletów
6. Programowanie komponentowe
Jezyk
˛
Java
Krótka historia jezyków
˛
programowania (1)
⊳1⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊳2⊲
• Prostota
Ł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.
˛
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.
⊙
⊙
Dlaczego Java ?
• 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.
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.
Cezary Bolek <[email protected]>
⊙
Krótka historia jezyków
˛
programowania (2)
˛
• 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
Jezyk
˛
Java
Cezary Bolek <[email protected]>
• 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.
⊳3⊲
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
Cezary Bolek <[email protected]>
⊙
⊳5⊲
Dlaczego Java ? (cd.)
Jezyk
˛
Java — historia
˛
• Wielowatkowość
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.
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
• 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
⊙
Wirtualna maszyna Javy jest interpreterem kodu pośredniego.
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.
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.
• 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
Cezary Bolek <[email protected]>
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).
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
Jezyk
˛
Java
Kod pośredni — Wirtualna Maszyna Javy
Wyjściem kompilatora Javy nie jest kod wykonywalny, lecz kod pośredni.
⊳6⊲
Jezyk
˛
Java
Pierwszy program (1)
Cezary Bolek <[email protected]>
⊙
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
⊳7⊲
Jezyk
˛
Java
Pierwszy program (2)
Cezary Bolek <[email protected]>
⊙
⊳8⊲
Pierwszy program (3)
1
Plik „Pierwszy.java”:
1
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 " ∗ /
5
6
3
4
5
6
7
8
9
10
11
7
8
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." ) ;
}
}
9
10
11
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
Cezary Bolek <[email protected]>
2
3
4
⊙
⊳9⊲
/∗
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
Składnia jezyka
˛
— podstawy
• Typy danych
• Kategorie składniowe
1. Słowa kluczowe
np. void, class, public
Typy danych
2. Separatory
{ } ( ) ; ,
abstract
boolean
break
bye
case
catch
char
class
Typy proste
Typy z³o¿one
3. Komentarze
// Komentarz
/* Komentarz */
Typy tablicowe
4. Operatory
np. arytmetyczne + - * % ++ -
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.
˛
• Słowa kluczowe — 48
Typy obiektowe
5. Identyfikatory
⋆ nazw klas lub zmiennych
⋆ nazw funkcji
⋆ etykiet
⋆ stałych wyliczeniowych
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
1. Typy całkowite — zdefiniowane sa˛ cztery typy całkowite o różnych
szerokościach (zakresach).
Wszystkie liczby całkowite sa˛ liczbami ze znakiem.
• byte – 8-bitowy typ ze znakiem
Zakres: (−27 ) . . . (27 − 1) → (od -128 do 127 )
• Bloki kodu { } — logiczne grupowanie instrukcji.
Traktowane funkcjonalnie jak jedna instrukcja. Stosowane zwykle w konstrukcjach
sterujacych
˛
i do określania zasiegu
˛ zmiennych.
Przykład deklaracji zmiennej:
byte a ;
byte c , d ;
• 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
• short – 16-bitowy typ ze znakiem
Zakres: (−215 ) . . . (215 − 1) → (od -32 768 do 32 767 )
Przykład deklaracji zmiennej:
short zm ;
short t e s t , a ;
• Wszystkie instrukcje kończy sie˛ znakiem średnika – ;
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 12 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 13 ⊲
• double – typ zmiennopozycyjny zajmujacy
˛ 64 bity pamieci
˛
Zakres: od ±1.7 · 10−308 do ±1.7 · 10+308
• int – 32-bitowy typ ze znakiem
Zakres: (−231 ) . . . (231 − 1) → (od -2 147 483 648 do 2 147 483 647 )
3. Typy znakowy char — 16-bitowy typ reprezentujacy
˛ znak zgodnie ze
standardem Unicode.
Przykład deklaracji zmiennej:
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.
long k a r t ;
long sw2 ;
2. Typy zmiennopozycyjne — używane przy obliczeniu wyrażeń
wymagajacych
˛
ułamkowej precyzji
do ±3.4 · 10
0x1FA
2.0
Cezary Bolek <[email protected]>
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
float x ;
f l o a t xy , dlugosc ;
Jezyk
˛
Java
−34
4. liczby zmiennopozycyjne
Przykład przypisania wartości:
Przykład deklaracji zmiennej:
1234
2. liczby całkowite ósemkowe – jeśli zaczynaja˛ sie˛ od zera
3. liczby całkowite szesnastkowe – jeśli zaczynaja˛ sie˛ od ’0x’
char ch ;
char znak , c hr ;
+38
1. Liczby całkowite dziesietne
˛
0123 / / system osemkowy , wiec 09 by l oby bledem
Przykład deklaracji zmiennej:
• float – typ zmiennopozycyjny zajmujacy
˛ 32 bity pamieci
˛
Zakres: od ±3.4 · 10
⊳ 14 ⊲
boolean t e s t ;
• 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 )
−38
⊙
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 ;
i n t k , w, i ;
int a;
Cezary Bolek <[email protected]>
4. Typy logiczny boolean — może przyjmować jedna˛ z dwóch wartości true
lub false (nie 0 i 1)
Przykład deklaracji zmiennej:
Przykład deklaracji zmiennej:
Jezyk
˛
Java
"Hello"
⊙
⊳ 15 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 16 ⊲
Jezyk
˛
Java
"Koniec\n"
Cezary Bolek <[email protected]>
⊙
⊳ 17 ⊲
Zmienne — podstawowe zasady używania
Zasieg
˛ zmiennych — definiowany przez metode˛
Automatyczna konwersja i promocja typów
• 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’ ;
• Zasieg
˛ i czas życia
i n t k =0;
double a = k ;
Warunkiem tego jednak jest:
• 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)
• kompatybilność typów (typy musza˛ być liczbowe)
• typ docelowy musi być wiekszy
˛
lub równy typowi źródłowy
• nie można deklarować zmiennej, gdy inna zmienna o takiej samej nazwie
istnieje w zasiegu
˛
zewnetrznym
˛
⋆ zasieg
˛ definiowany przez metode˛
⊙
⊳ 18 ⊲
2. Konwersja typu — rzutowanie
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 19 ⊲
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
double a ;
short k ;
k =( short ) a ;
W sytuacji gdy wartość liczbowa nie mieści sie˛ w typie docelowym, dane
zostaja˛ zmodyfikowane.
Podczas wykonywania operacji arytmetycznych wystepuje
˛
automatyczna
konwersja zgodnie z poniższymi regułami:
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
⊙
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.
3. Promocja automatyczna
Cezary Bolek <[email protected]>
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 ) ;
⊳ 20 ⊲
Operatory arytmetyczne
Automatyczna konwersja i promocja typów — przykłady
W sytuacji, gdy automatyczna konwersja nie może być przeprowadzona,
można jawnie dokonać konwersji z jednego typu na inny.
•
•
•
•
Może wystapić
˛ gdy jeden typ danych przypisywany jest do innego typu
zmiennej, np:
• 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 ) ;
Cezary Bolek <[email protected]>
1. Konwersja automatyczna
• zasiegi
˛ moga˛ być zagnieżdżone, a obiekty (np. zmienne) sa˛ widoczne w
zasiegu
˛
wewnetrznym
˛
• Zmienne można inicjować dynamicznie:
Jezyk
˛
Java
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).
Działanie operatora dekrementacji jest analogiczne — efektem jest zmniejszenie wartości
zmiennej o jeden.
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 21 ⊲
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 bitowe – przykład
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 )
1
2
3
4
5
6
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
7
8
9
10
11
12
13
14
15
16
17
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 (>>>, <<<).
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
}
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 relacji
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
Cezary Bolek <[email protected]>
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 26 ⊲
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 ( a >6) { }
Jezyk
˛
Java
⊳ 25 ⊲
Operatory logiczne
Zwracaja˛ wartość typu logicznego (boolean) określajac
˛ a˛ relacje˛ zachodzac
˛ a˛
miedzy
˛
argumentami.
Operator
==
!=
>
<
>=
<=
⊙
i f ( denom ! =0 && num / denom>10) { . . . }
⊙
⊳ 27 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 28 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 29 ⊲
Tablice
Tablice
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:
typ nazwa tablicy[];
nazwa tablicy=new typ[rozmiar ];
Priorytet operatorów
Najwyższy
↓
Najniższy
() [] .
++ – – !
* / %
+ –
> >= < <=
== !=
&
∧
|
?:
= op=
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 ’ | ’
Przykład:
i n t Tab [ ] ;
Tab=new i n t [ 1 0 ] ;
double A [ ] ;
A=new double [ 5 0 0 ] ;
Zwykle deklaracji zmiennej tablicowej i alokacji pamieci
˛ dokonuje sie˛ w jednej
linii:
/ / 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 ’
i n t Tab [ ] = new i n t [ 1 0 ] ;
double A [ ] = new double [ 5 0 0 ] ;
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 ;
Możliwe jest inicjowanie tablicy, tj. nadawanie jej elementom wartości już
podczas deklaracji:
int
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 30 ⊲
Jezyk
˛
Java
Tab [ 3 ] = 0 ;
x=A [ s ] ;
A[ 2 ] = (A[ 0 ] +A [ 1 ] ) / 2 ;
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 32 ⊲
Tablice wielowymiarowe
Tablice wielowymiarowe sa˛ w rzeczywistości tablicami tablic. Aby ja˛
zadeklarować należy podać każdy dodatkowy wymiar, np:
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:
Indeksy tablicy rozpoczynaja˛ sie˛ od ZERA !, np:
1
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
2
3
4
5
6
7
8
9
10
Cezary Bolek <[email protected]>
⊳ 31 ⊲
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
Do elementów tablicy można odwoływać sie˛ za pomoca˛ operatora
indeksowania [], czyli podajac
˛ po nazwie tablicy numer elementu w nawiasach
kwadratowych:
Jezyk
˛
Java
⊙
Tablice – rozmiar
Tablice – odwoływanie do elementów
i n t v [ ] = new
v [0]=3;
v [1]=7;
v [2]=1;
v [3]=5;
v [4]=2;
/ / v [5]=2;
Cezary Bolek <[email protected]>
Tab [ ] = { 0 , 2 , 4 , 6 , 8 , 1 0 , 1 2 , 1 4 , 1 6 , 1 8 } ;
Rozmiar tablicy (i alokacja pamieci)
˛ jest obliczany na podstawie listy podanych
wartości.
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.
⊙
⊳ 33 ⊲
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)
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
9
T
warunek
T
warunek
7
Cezary Bolek <[email protected]>
⊙
⊳ 36 ⊲
instrukcja1
instr_pocz
instrukcja2
instrukcja3
warunek
F
do {
instrukcja1;
instrukcja2;
...
} while(warunek);
instrukcja4
instrukcja
warunek
F
instrukcja
instrukcja
instr_kon
T
warunek
F
Jezyk
˛
Java
Cezary Bolek <[email protected]>
1
2
3
4
5
6
7
8
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" ;
12
13
14
15
5
18
class poraroku {
public s t a t i c void main ( S t r i n g args [ ] ) {
i n t m i es i ac =5; / / maj
S t r i n g poraroku ;
9
10
11
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
System . out . p r i n t l n ( "Miesiac "+ m i es i ac +" jest "+ poraroku ) ;
16
17
}
}
f o r ( i n t i =2; i <=n ; s=s∗ i ++) ;
System . out . p r i n t l n ( "n!="+s ) ;
}
}
Jezyk
˛
Java
wyra¿enie
wartoϾ1
instrukcja
instrukcja
break
wartoϾ2
instrukcja
instrukcja
break
instrukcja
instrukcja
Cezary Bolek <[email protected]>
⊙
⊳ 38 ⊲
Zasieg
˛ zmiennej i ograniczony jest tylko do ciała petli.
˛
6
7
Jezyk
˛
Java
switch(wyrażenie1) {
case wartość1 :
instrukcja;
instrukcja;
...
break;
case wartość2 :
instrukcja;
instrukcja;
...
break;
default:
instrukcja;
instrukcja;
...
break;
}
Instrukcje sterujace
˛ – przykłady, switch
Drabina if-else-if:
f o r ( i n t i =1; i <=10; i ++) {
System . out . p r i n t l n ( n ) ;
}
2
3
⊳ 37 ⊲
Instrukcje sterujace
˛ – przykłady
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 ) ;
}
}
1
⊙
Instrukcja for:
8
9
F
• Instrukcja wyboru ’switch’
default
instrukcja2
Instrukcje sterujace
˛ – przykłady
5
6
warunek
Instrukcja while:
3
4
T
for( instr pocz ; warunek ; instr kon)
instrukcja;
• Instrukcja iteracyjna ’do–while’
F
T
instrukcja1
}
Jezyk
˛
Java
1
2
instrukcja2
F
}
10
11
instrukcja1
while(warunek) {
instrukcja1;
instrukcja2;
...
}
F
T
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
warunek
if (warunek1) instrukcja1;
else if (warunek2) instrukcja2;
else if (warunek3) instrukcja3;
else instrukcja4;
5
7
T
• Instrukcja iteracyjna ’for’
• 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
Instrukcje sterujace
˛ (2)
• Instrukcja iteracyjna ’while’
• Instrukcja wyboru ’if’
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 }
Cezary Bolek <[email protected]>
⊙
⊳ 39 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 40 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 41 ⊲
Instrukcja ’break’
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.
˛
f o r ( i n t i =1; ; i ++)
i f ( i ==10) 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:
1
2
3
4
5
6
7
8
9
10
11
12
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 ( ) ;
}
}
}
Obsługa łańcuchów tekstowych
String s ;
Łańcuchy musza˛ być przed użyciem zainicjowane, tzn. należy im przypisać
konkretny ciag
˛ znaków (stała˛ łańcuchowa),
˛ np:
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 ) ;
}
}
}
Cezary Bolek <[email protected]>
⊙
⊳ 42 ⊲
Operacje na łańcuchach - scalanie (konkatenacja)
Jezyk
˛
Java
Cezary Bolek <[email protected]>
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
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:
⊙
⊳ 43 ⊲
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 ;
S t r i n g s1="Ala "+"ma "+"kota" ;
S t r i n g s2=s1+" i psa" ;
Podczas scalania, łańcuch może wykorzystywać swoja˛ aktualna˛ zawartość:
S t r i n g s="Dzis jest " ;
s=s+"niedziela" ;
s+=" palmowa" ;
S t r i n g s="Dwa plus dwa="+2+2;
System . o u t . p r i n t l n ( s ) ;
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).
S t r i n g s="Ala ma kota" ;
int x ;
x=s . l e n g t h ( ) ;
S t r i n g s="Ala ma kota" ;
char z ;
z=s . c har A t ( 4 ) ; / / zwraca znak ’m ’
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:
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]>
⊳ 44 ⊲
• w celu odczytania z łańcucha jednego znaku na określonej pozycji, należy odwołać sie˛ do
metody charAt(i), np:
Dwa p l u s dwa=22
Jezyk
˛
Java
⊙
• 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:
Kolejność wykonywanych operacji można zmienić stosujac
˛ nawiasy:
⊳ 45 ⊲
Cezary Bolek <[email protected]>
W szczególności:
da w wyniku:
⊙
Jezyk
˛
Java
Operacje na łańcuchach - obiektowość
i n t wiek =7;
S t r i n g s="Ala ma "+wiek+" lat" ;
Stałe łańcuchowe sa˛ także typu String, wobec czego moga˛ być parametrami
operatora ’+’:
Cezary Bolek <[email protected]>
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 ’
Operacje na łańcuchach - scalanie (konkatenacja)
Podczas scalania łańcuchów, parametrem operatora ’+’ moga˛ być zmienne
innych typów, które zostana˛ automatycznie przekonwertowane na typ
łańcuchowy, np:
Operator + pozwala na łaczenie
˛
łańcuchów w jeden, np:
Jezyk
˛
Java
String s ;
s="Tekst" ;
lub od razu podczas deklaracji:
Instrukcji break przerywa wykonywanie działania instrukcji if, while, do–while, for.
Jezyk
˛
Java
Ł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:
Instrukcja continue przerywa bieżacy
˛ cykl iteracyjny i wymusza nastepny.
˛
⊙
⊳ 46 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 47 ⊲
Operacje na łańcuchach - przykłady
Operacje na łańcuchach - porównywanie
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 ) ;
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]>
System . o u t . p r i n t l n ( s1 . equals ( s2 ) ) ;
S t r i n g s1="Kowalski" ;
S t r i n g s2="Nowak" ;
i n t k=s1 . compareTo ( s2 ) ;
⊙
⊳ 48 ⊲
0
<0
>0
Jezyk
˛
Java
Przykład:
4
5
6
7
8
9
10
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 ) ;
/ / porownuje s1 z s2
-
efektem jest:
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]>
t r ue
false
t r ue
⊙
⊳ 49 ⊲
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 ) ;
}
Cezary Bolek <[email protected]>
⊙
⊳ 51 ⊲
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 ( ) ) ;
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊳ 50 ⊲
1
3
Jeżeli metoda nie wymaga żadnych parametrów, wówczas lista parametrów w
deklaracji metody jest pusta, np:
⊙
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:
2
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
Wartość, która˛ zwraca metoda określa sie˛ instrukcja˛ return.
Cezary Bolek <[email protected]>
Jezyk
˛
Java
Zmienne statyczne
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 ) ) ;
}
}
Jezyk
˛
Java
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:
Metody i zmienne statyczne
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.
3
t r ue
false
false
Metoda zwraca wartość:
Metody i zmienne statyczne
2
powyższy program wydrukuje nastepuj
˛ ace
˛ wartości:
/ / 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:
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).
1
/ / drukuje false
Do porównywania zawartości dwóch łańcuchów wykorzystuje sie˛ metode˛ equals:
1
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 ) ;
⊙
⊳ 52 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 53 ⊲
Programowanie obiektowe
i aplety
Programowanie obiektowe
Programowanie obiektowe — klasy
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.
Klasa jest definicja˛ wzoru według którego tworzone sa˛ konkretne obiekty —
egzemplarze klasy.
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.
Wewnatrz
˛ klasy definiuje sie˛ dwie cechy obiektu:
• Zmienne, które zostana˛ utworzone dla każdego obiektu tej klasy
˛ a˛ mogły wykonywać operacje na danym obiekcie, tj.
• Metody, czyli procedury, które bed
jego własnych danych.
class nazwaklasy {
typ zmienna;
..
typ zmienna;
Postać
deklaracji
klasy:
• 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]>
Postać deklaracji klasy — przykład
1.
deklaracje metod
obiektów danej klasy







Cezary Bolek <[email protected]>
⊙
⊳ 56 ⊲
Przypisywanie obiektów do zmiennych obiektowych (1)
x
pud1 . y =3;
pud2 . y =4;
pud1 . z =5;
pud2 . z =3;
2.
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 ) ;
6
}
Zmienna
obiektowa
⊙
⊳ 57 ⊲
Jezyk
˛
Java
y
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();
Zmienne x, y, z istnieja˛ oddzielnie dla każdego obiektu.
Zmienne zadeklarowane bez słowa „static” istnieja˛ tylko razem z konkretnymi obiektami.
pud1
z
pud1
Utworzenie obiektu w pamieci
˛ i przypisanie jego adresu do zmiennej
obiektowej
}
Cezary Bolek <[email protected]>
pud1 = new Box();
null
@
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”).
5
Jezyk
˛
Java
@
I
@
typ klasy
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 ( ) ;
13
14








Deklaracja zmiennej obiektowej
1
11
12
typ metoda(parametry) {
...
}
typ metoda(parametry) {
...
}
}
Jezyk
˛
Java
Box pud1;
Od tej pory można już zadeklarować obiekty klasy Box i odwoływać sie˛ do ich zmiennych
według wzoru: obiekt.zmienna.
pud1 . x =2;
pud2 . x =7;
deklaracje zmiennych
obiektów klasy
Deklarowanie obiektów przebiega w dwóch etapach:
class Box {
double x ;
double y ;
double z ;
}
9
10
⊳ 55 ⊲
Deklarowanie obiektów
Definicja klasy Box:
6
7
8
⊙


metoda tworzaca obiekt
o takiej samej nazwie
jak klasa obiektu
(tzw. konstruktor)
⊙
⊳ 58 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 59 ⊲
Przypisywanie obiektów do zmiennych obiektowych (2)
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.
A
y
null
z
y
z
Przykład:
Metoda obliczajaca
˛ objetość
˛
klasy Box:
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
Box B;
Metody sa˛ procedurami, które operuja˛ na zmiennych danego obiektu. Metode˛
wywołuje sie˛ zawsze dla danego obiektu.
x
A
B = A;
Na przykład:
Box A = new Box();
Metody (1)
Przypisywanie obiektów do zmiennych obiektowych (3)
B
class Box {
double x , y , z ;
double o b j e t o s c ( )
{
r e t u r n x∗y∗z ;
}
}
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
1
2
3
4
obiekt.metoda(parametry)
Przykład:
4
5
6
7
8
9
10
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 ur n x∗ y ∗ z ;
}
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
5
6
7
8
9
10
/ / 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 ( ) ) ;
}
}
⊙
⊳ 61 ⊲
Metody — przykład
Metody (2)
Do wywoływania metody dla konkretnego obiektu stosuje sie˛ zapis:
1
2
3
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.
/ / w ypisanie na e k r a n i e l i c z b y 5
Cezary Bolek <[email protected]>
11
12
13
14
15
16
17
{
18
19
20
/ / w y p i s u j e 12
/ / w y p i s u j e 12
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 ur 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 ( ) ) ;
}
}
2
3
objetosc
4
5
⊳ 63 ⊲
9
10
11
12
13
14
15
{
16
17
/ / w y p i s u j e 20
18
19
Cezary Bolek <[email protected]>
⊙
⊳ 62 ⊲
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 ur 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 ( ) ) ;
}
}
objetosc
/ / 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
Dzieki
˛ tak zdefiniowanej metodzie wymiar odwoływanie sie˛ bezpośrednie do poszczególnych
zmiennych obiektu jako obiekt.zmienna nie jest już potrzebne.
Zmienne te mogłyby być niedostepne
˛
dla programisty, ale nie utrudniłoby to korzystanie z
obiektu (hermetyzacja).
Metoda nie zwraca żadnej wartości — void.
Jezyk
˛
Java
6
7
8
/ / metoda u s t a w i a j a c a zmienne o b i e k t u
Cezary Bolek <[email protected]>
Metody — przykład
1
Metoda przypisuje wartości parametrów od razu do wszystkich zmiennych obiektu.
⊙
Jezyk
˛
Java
Metoda wymiar może być wywoływana dla każdego obiektu klas Box.
/ / metoda o b l i c z a j a c a o b j e t o s c
⊙
⊳ 64 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 65 ⊲
Jak działa aplet ?
Wprowadzanie do apletów
Szkielet apletu
1
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:
1
2
2
3
4
5
Za³adowanie strony.
Inicjalizacja
apletu
init()
Poznowne
za³adowanie strony
zawieraj¹cej aplet
6
7
8
9
10
Uruchomienie
apletu
start()
11
12
Opuszczenie strony
zawieraj¹cej
aplet
import j a v a . awt . ∗ ;
import j a v a . a p p l e t . ∗ ;
13
14
paint()
15
16
17
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
Zakoñczenie
dzia³ania apletu.
Usuniêcie
z pamiêci
22
23
⊙
⊳ 66 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
3
4
5
6
7
import j a v a . awt . ∗ ;
2 import j a v a . a p p l e t . ∗ ;
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);
}
}
1
Cezary Bolek <[email protected]>
Jezyk
˛
Java
Cezary Bolek <[email protected]>
3
4
5
6
7
8
9
10
11
12
13
14
class Konto {
p r i v a t e double kwota ;
double s al do ( ) {
r et ur n kwota ;
}
public void wplac ( double k ) {
kwota+=k ;
}
public boolean wyplac ( double k ) {
i f ( kwota−k <0) r et ur n f a l s e ;
kwota−=k ;
r et ur n t r ue ;
}
}
⊙
⊳ 69 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊳ 68 ⊲
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
⊙
Konstruktory
1
2
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.
3
Jezyk
˛
Java
⊳ 67 ⊲
1
2
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).
8
9
10
⊙
Kontrola dostepu
˛
Osadzanie apletu w dokumencie HTML
6
7
24
25
26
Cezary Bolek <[email protected]>
public class s i m pl 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 ) ;
}
}
20
21
destroy()
<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>
4
5
18
19
Wyœwietlenie
zawartoœci apletu
stop()
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
}
}
⊙
⊳ 70 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
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
class Konto {
p r i v a t e double kwota ;
public Konto ( double k ) {
kwota=k ;
}
double s al do ( ) {
r et ur n kwota ;
}
public void wplac ( double k ) {
kwota+=k ;
}
public boolean wyplac ( double k ) {
i f ( kwota−k <0) r et ur n f a l s e ;
kwota−=k ;
r et ur n t r ue ;
}
}
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
Dziedziczenie (1)
Stosowanie obiektów jako parametrów
1
1
2
3
4
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
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
Jezyk
˛
Java
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 ur 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 ) ;
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.
4
5
6
7
8
9
10
11
12
13
14
public void wplac ( double k ) {
kwota+=k ;
}
public boolean wyplac ( double k ) {
i f ( kwota−k <0) r et ur n f a l s e ;
kwota−=k ; r et ur n t r ue ;
}
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 ur n t r ue ;
}
else r et ur n f a l s e ;
}
1 public class KontoApl4 extends A p p l e t {
2
Konto knt1 , k nt 2 ;
3
public void i n i t ( ) {
4
k nt 1 =new Konto ( 2 0 0 ) ;
5
k nt 2 =new Konto ( 4 0 0 ) ;
6
k nt 1 . p r z e l e j D o ( knt2 , 1 0 0 ) ;
7
}
8
public void p a i n t ( Graphics g ) {
9
g . d r a w S t r i n g ( "Saldo konta1 :"+ k nt 1 . s aldo ( ) , 1 0 , 3 0 ) ;
10
g . d r a w S t r i n g ( "Saldo konta2 :"+ k nt 2 . s aldo ( ) , 1 0 , 5 0 ) ;
11
}
12 }
⊙
2
3
⊳ 72 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Dziedziczenie (2)
⊙
Deklarujac
˛ nowa˛ klase˛ obiektów można
sie˛ oprzeć na istniejacych
˛
już definicjach
klas, dodajac
˛ jedynie nowe elementy
(zmienne, metody) do już zdefiniowanych.
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
⊳ 73 ⊲
Jezyk
˛
Java
Przesłanianie metod
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
27
28
29
30
31
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 ;
}
}
Cezary Bolek <[email protected]>
⊙
⊳ 74 ⊲
Odwoływanie sie˛ do przesłonietych
˛
składowych – super
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 ) { . . . } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.
1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Konto {
/ / nadklasa
public boolean wyplac ( double k ) {
i f ( kwota−k <0) r et ur n f a l s e ;
kwota−=k ; r et ur n t r ue ;
}
}
class KontoStandard extends Konto { / / podklasa
public boolean wyplac ( double k ) {
i f ( kwota−k − .5<0) r et ur n f a l s e ;
kwota−=k + . 5 ; r et ur n t r ue ;
}
}
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 ) ;
}
}
⊙
⊳ 75 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
1
2
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.
3
4
5
6
7
Słowo super może być też służyć do
wywołania w konstruktorze podklasy
konstruktora nadklasy innego niż domyślny.
8
9
1
2
3
4
5
6
7
8
9
10
11
12
13
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: "+
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Konto {
p r i v a t e double kwota ;
Konto ( double k ) {
kwota=k ;
}
double s al do ( ) {
r et ur n kwota ;
}
public void wplac ( double k ) {
kwota+=k ;
}
public boolean wyplac ( double k ) {
i f ( kwota−k <0) r et ur n f a l s e ;
kwota−=k ; r et ur n t r ue ;
}
}
class KontoSpecjalne extends Konto {
KontoSpecjalne ( ) {
super ( 5 ) ;
}
public boolean wyplac ( double k ) {
r et ur n super . wyplac ( k + . 5 ) ;
}
}
⊙
⊳ 76 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 77 ⊲
Dziedzicznie – przykład
Dynamiczne przydzielanie metody – polimorfizm
Metody i klasy abstrakcyjne
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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]>
1 class Konto {
/ / nadklasa
1
2
p r i v a t e double kwota ;
2
3
double s aldo ( ) {
3
4
r etu r n kwota ;
4
5
}
5
6
public void wplac ( double k ) {
6
7
kwota+=k ;
7
8
}
8
9
public boolean wyplac ( double k ) {
9
10
i f ( kwota−k <0) r etu r n f a l s e ;
10
11
kwota−=k ; r etu r n tr u e ;
11
12
}
12
13
public boolean p r z e l e j D o ( Konto knt , double k ) { 13
14
r etu r n f a l s e ;
14
15
}
15
⊙
⊳ 78 ⊲
Jezyk
˛
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
abst r act class Konto {
/ / nadklasa
p r i v a t e double kwota ;
double s al do ( ) {
r et ur n kwota ;
}
public void wplac ( double k ) {
kwota+=k ;
}
public boolean wyplac ( double k ) {
i f ( kwota−k <0) r et ur n f a l s e ;
kwota−=k ; r et ur n t r ue ;
}
abst 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.
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
Cezary Bolek <[email protected]>
Zapobieganie przesłanianiu i dziedziczeniu
}
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 ;
1 public class KontoApl8 extends A p p l e t {
2
Konto knt1 , k nt 2 ;
3
public void i n i t ( ) {
4
k nt 1 =new KontoStandard ( ) ; k nt 1 . wplac ( 3 0 0 ) ;
5
k nt 2 =new KontoVIP ( ) ;
k nt 2 . wplac ( 3 0 0 ) ;
6
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 ) ;
7
}
8
public void p a i n t ( Graphics g ) {
9
g . d r a w S t r i n g ( "Saldo konta1 :"+ k nt 1 . s aldo ( ) , 1 0 , 3 0 ) ;
10
g . d r a w S t r i n g ( "Saldo konta2 :"+ k nt 2 . s aldo ( ) , 1 0 , 5 0 ) ;
11
}
12 }
Java możliwe jest definiowanie klas, których wyłacznym
˛
W jezyku
˛
przeznaczeniem jest ich późniejsze dziedziczenie. Klasy takie nosza˛ nazw˛e
klas abstrakcyjnych.
⊙
⊳ 79 ⊲
Jezyk
˛
Java
Interfejsy
Cezary Bolek <[email protected]>
⊙
⊳ 80 ⊲
Interfejsy – przykład
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.
1
2
3
4
5
6
7
8
9
1
2
3
abst 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 ur n kwota ;
}
f i n a l public void wplac ( double k ) {
kwota+=k ;
}
// ...
class KontoNowe extends Konto {
public double s al do ( ) { / / Blad !
...
}
class KontoStandardNowe extends KontoStandard { / / Blad !
Cezary Bolek <[email protected]>
⊙
⊳ 81 ⊲
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 ) ;
}
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 ) {
// ...
Jezyk
˛
Java
Java istnieje możliwość wyabstrahowania interfejsu klasy z jej
W jezyku
˛
implementacji. Definiujac
˛ interfejs wyszczególnia sie˛ co klasa ma robić nie
określajac
˛ w jaki sposób ma to być zrealizowane.
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]>
Aby zaimplementować
interfejs, klasa musi utworzyć
pełny zestaw metod przezeń
zdefiniowanych, swobodnie
określajac
˛ szczegóły
implementacji.
⊙
⊳ 82 ⊲
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
27
28
29
30
i n t e r f a c e Operacje {
1 class KontoVIP extends Konto implements O ds et k i {
double s aldo ( ) ;
2
public boolean p r z e l e j D o ( Konto knt , double k ) {
void wplac ( double k ) ;
3
i f ( wyplac ( k ) ) {
boolean wyplac ( double k ) ;
4
k n t . wplac ( k ) ;
boolean p r z e l e j D o ( Konto knt , double k ) ;
5
r etu r n tr u e ;
}
6
}
i n t e r f a c e O ds et k i {
7
else
public void k a p i t a l i z u j ( ) ;
8
r etu r n f a l s e ;
}
9
}
ab str act class Konto implements Operacje {
10
public void k a p i t a l i z u j ( ) {
p r i v a t e double kwota ;
11
wplac ( s aldo ( ) ∗ 0 . 1 ) ;
f i n a l public double s aldo ( ) {
12
}
r etu r n kwota ;
13 }
}
14 public class KontoApl11 extends A p p l e t {
public void wplac ( double k ) {
15
Konto knt1 , k nt 2 ;
kwota+=k ;
16
public void i n i t ( ) {
}
17
k nt 1 =new KontoStandard ( ) ;
public boolean wyplac ( double k ) {
18
k nt 1 . wplac ( 3 0 0 ) ;
i f ( kwota−k <0) r etu r n f a l s e ;
19
k nt 2 =new KontoVIP ( ) ;
kwota−=k ; r etu r n tr u e ;
20
k nt 2 . wplac ( 3 0 0 ) ;
}
21
i f ( k nt 1 instanceof O ds et k i )
}
22
( ( O ds et k i ) k nt 1 ) . k a p i t a l i z u j ( ) ;
class KontoStandard extends Konto {
23
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 ) { 24
( ( 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 ) ) {
25
}
k n t . wplac ( k ) ;
26
public void p a i n t ( Graphics g ) {
r etu r n tr u e ;
27
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 ;
28
g . d r a w S t r i n g ( "Konto 2: "+k nt 2 . s aldo ( ) , 1 0 , 5 0 ) ;
}
29
}
}
30 }
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 83 ⊲
Wprowadzenie do modelu delegacji zdarzeń – przykład
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
27
28
29
30
31
32
i n t e r f a c e Operacje {
double s aldo ( ) ;
void wplac ( double k ) ;
}
i n t e r f a c e Odsetk {
public void k a p i t a l i z u j ( ) ;
}
class Bank {
p r i v a t e A r r a y L i s t konta =new A r r a y L i s t ( ) ;
public void dodajKonto ( Konto k n t ) {
konta . add ( k n t ) ;
}
public A r r a y L i s t l i s t a K o n t ( ) {
r etu r n konta ;
}
public void k a p i t a l i z u j O d s e t k i ( ) {
f o r ( I t e r a t o r i t r =konta . i t e r a t o r ( ) ;
i t r . hasNext ( ) ; ) {
Konto k n t =( Konto ) i t r . nex t ( ) ;
knt . k a p i t a l i z u j ( ) ;
}
}
}
ab str act class Konto implements Operacje , Odsetk {
p r i v a t e double kwota ;
f i n a l public double s aldo ( ) {
r etu r n kwota ;
}
public void wplac ( double k ) {
kwota+=k ;
}
}
Jezyk
˛
Java
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
27
28
29
30
31
32
class KontoStandard extends Konto {
public void k a p i t a l i z u j ( ) {
wplac ( s aldo ( ) ∗ 0 . 0 5 ) ;
}
}
class KontoVIP extends Konto {
public void k a p i t a l i z u j ( ) {
wplac ( s aldo ( ) ∗ 0 . 1 ) ;
}
}
public class KontoApl12 extends A p p l e t {
Bank PKO=new Bank ( ) ;
public void i n i t ( ) {
Konto k n t ;
k n t =new KontoStandard ( ) ; PKO. dodajKonto ( k n t ) ;
k n t . wplac ( 4 0 0 ) ;
k n t =new KontoVIP ( ) ;
PKO. dodajKonto ( k n t ) ;
k n t . wplac ( 4 0 0 ) ;
k n t =new KontoVIP ( ) ;
PKO. dodajKonto ( k n t ) ;
k n t . wplac ( 2 0 0 ) ;
PKO. k a p i t a l i z u j O d s e t k i ( ) ;
}
public void p a i n t ( Graphics g ) {
i n t nr =1;
A r r a y L i s t ka=PKO. l i s t a K o n t ( ) ;
f o r ( I t e r a t o r i =ka . i t e r a t o r ( ) ; i . hasNext ( ) ; ) {
Konto k n t =( Konto ) i . nex t ( ) ;
g . d r a w S t r i n g ( "Konto "+ nr +":"+ k n t . s aldo ( ) ,
10 ,20∗ nr + + ) ;
}
}
}
Cezary Bolek <[email protected]>
⊙
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
• Klasy zdarzeń
Odbiornik zdarzenia odbiera kopie˛
obiektu odpowiedniego typu
zawierajacego
˛
informacje o
zdarzeniu: class TypEvent
Jezyk
˛
Java
Cezary Bolek <[email protected]>
Model delegacji zdarzeń (1)
Czym jest zdarzenie w programowaniu w jezyku
˛
Java?
˛ zmiane˛ stanu źródła. Może
W modelu delegacji zdarzenie to obiekt opisujacy
on zostać wygenerowany w wyniku skorzystania przez użytkownika z
elementu interfejsu graficznego, np:
Zdarzenie jest to wystapienie
˛
określonej sytuacji zdefiniowanej przez
środowisko uruchomieniowe, np. naciśniecie
˛
klawisza myszki, przesuniecie
˛
okna, upłyniecie
˛
interwału czasowego itp.
W jezyku
˛
Java poczawszy
˛
od wersji 1.1 system obsługi zdarzeń oparty jest na
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
• naciśniecie
˛
przycisku myszy lub klawiatury
• wybranie przycisku na ekranie
• wybranie pozycji z listy itp.
Zdarzenia moga˛ być też generowane bez udziału użytkownika, np:
• po upłynieciu
˛
interwału czasu
• Po otrzymaniu zdarzenia odbiornik przetwarza je
• przekroczeniu przez licznik określonej wartości
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.
• wystapienia
˛
błedu
˛
oprogramowania itp.
Można też dowolnie definiować i generować zdarzenia samodzielnie.
⊳ 84 ⊲
Jezyk
˛
Java
Model delegacji zdarzeń (2)
• Źródła zdarzeń
Obsługa zdarzeń w apletach
Cezary Bolek <[email protected]>
⊙
⊳ 85 ⊲
Interfejsy odbiorników zdarzeń oraz klasy zdarzeń (1)
Jezyk
˛
Java
Cezary Bolek <[email protected]>
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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 ⊲
⊳ 86 ⊲
Interfejsy odbiorników zdarzeń oraz klasy zdarzeń (2)
1
2
⊙
˛ metod zwiazanych
˛
z naciśnieciami
˛
Interfejs MouseListener definiuje pieć
przycisków myszy:
•
•
•
•
•
void
void
void
void
void
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
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)
Klasa reprezentujaca
˛ zdarzenia zwia˛
zane z mysza:
˛
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
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 88 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
1 public class I n t e r f A p l 2 extends A p p l e t
2
implements MouseListener , MouseMotionListener {
3
i n t x , y , dx , dy ;
4
boolean l p ;
5
public void i n i t ( ) {
6
addMouseListener ( t h i s ) ;
7
addMouseMotionListener ( t h i s ) ;
8
}
9
public void mousePressed ( MouseEvent e ) {
10
i f ( e . g e t B u t t o n ( ) = = MouseEvent . BUTTON1)
11
l p = tr u e ;
12
else
13
lp=false ;
14
x=e . getX ( ) ; y=e . getY ( ) ; dx=dy =0;
15
repaint ( ) ;
16
}
17
public void mouseDragged ( MouseEvent e ) {
18
dx=e . getX () − x ;
19
dy=e . getY () − y ;
20
repaint ( ) ;
21
}
22
public void p a i n t ( Graphics g ) {
23
i f ( l p ) g . drawOval ( x , y , dx , dy ) ;
24
else g . f i l l O v a l ( x , y , dx , dy ) ;
25
}
26
public void mouseReleased ( MouseEvent e ) { }
27
public void mouseClicked ( MouseEvent e ) { }
28
public void mouseEntered ( MouseEvent e ) { }
29
public void mouseExited ( MouseEvent e ) { }
30
public void mouseMoved ( MouseEvent e ) { }
31 }
⊙
⊳ 89 ⊲
Interfejsy odbiorników zdarzeń oraz klasy zdarzeń (3)
Interfejsy odbiorników zdarzeń oraz klasy zdarzeń (4)
Inne klasy i interfejsy odbiorników zdarzeń (1)
1
2
˛
z klawiatura:
˛
Interfejs KeyListener definiuje trzy metody zwiazanych
˛
mysza˛ komponentu
• void keyPressed(KeyEvent me) – klikniecie
• 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)
7
8
9
12
13
KeyEvent
14
15
16
Wybrane metody klasy:
17
18
˛ naciśniety
˛ klawisz
• char getKeyChar() – zwraca znak reprezentujacy
• 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]>
5
6
10
11
Klasa reprezentujaca
˛ zdarzenia zwiazane
˛
z klawiatura:
˛
Jezyk
˛
Java
3
4
19
20
21
22
23
24
25
⊙
⊳ 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]>
˛
pola wyboru
• Klasa ItemEvent – zdarzenie generowane w wyniku klikniecia
lub pozycji listy oraz w wyniku zaznaczenia pozycji menu, która˛ można
zaznaczać.
ItemListener
void addItemListener(ItemListener al)
• Klasa TextEvent – zdarzenie generowane przez pola i obszary tekstowe
(np. okna edycyjne), gdy użytkownik lub program wprowadza do nich znaki.
Interfejs:
Rejestracja:
Jezyk
˛
Java
usuwaniu komponentu z kontenera (np. przycisku z okna apletu).
Interfejs:
Rejestracja:
traci ognisko (focus).
Interfejs:
Rejestracja:
⊳ 93 ⊲
⊙
⊳ 91 ⊲
Jezyk
˛
Java
AWT zawiera nastepuj
˛ ace
˛ rodzaje kontrolek:
• Etykiety (ang. labels)
• Przyciski (ang. push buttons)
• Pola wyboru (ang. check boxes)
⊙
⊳ 92 ⊲
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)
1
2
3
4
5
6
7
8
9
10
11
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:
• Paski przewijania (ang. scroll bars)
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
FocusListener
void addFocusListener(FocusListener al)
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.
⊙
ContainerListener
void addContainerListener(ContainerListener al)
• Klasa FocusEvent – zdarzenie generowane, gdy komponent uzyskuje lub
• Pola tekstowe (ang. text editing)
WindowListener
void addWindowListener(WindowListener al)
Cezary Bolek <[email protected]>
• Klasa ContainerEvent – zdarzenie generowane przy dodawaniu lub
• Listy (ang. (ang. choice list)
takich jak np: minimalizacja, aktywacja, deaktywacja itp.
ActionListener
void addActionListener(ActionListener al)
• Klasa AdjustmentEvent – zdarzenie generowane przez paski przewijania.
Interfejs:
AdjustmentListener
Rejestracja: void addAdjustmentListener(AdjustmentListener al)
• Listy opcji (ang. choice lists)
TextListener
void addTextListener(TextListener al)
• Klasa WindowEvent – zdarzenie generowane przy zmianach stanu okna,
Interfejs:
Rejestracja:
Interfejs odbiornika zdarzeń:
Rejestracja odbiornika zdarzeń:
Kontrolki
Inne klasy i interfejsy odbiorników zdarzeń (2)
Interfejs odbiornika zdarzeń:
Rejestracja odbiornika zdarzeń:
˛
• Klasa ActionEvent – zdarzenie generowane, gdy zostanie wciśniety
przycisk, dwukrotnie kliknieta
˛ pozycja listy lub wybrana pozycja menu.
⊙
⊳ 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)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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]>
⊙
•
•
•
•
Wybrane metody klasy Choice:
•
•
•
•
•
void add(String str)
String getSelectedItem()
int getSelectedIndex()
int getItemCount()
void select(int index)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Jezyk
˛
Java
Cezary Bolek <[email protected]>
1
2
3
4
5
6
7
8
9
10
11
boolean getState()
void setState(boolean on)
12
13
String getLabel()
14
15
void setLabel(String str)
16
17
18
19
20
21
22
23
24
⊳ 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 ue ) ;
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]>
⊙
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)
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 ⊲
Kontrolka umożliwiajaca
˛ tworzenie
przewijanych list, pozwalajacych
˛
wybór kilku lub jednej pozycji.
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).
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
⊳ 97 ⊲
Jezyk
˛
Java
Lista (klasa List)
1
2
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:
Opcje (klasa Choice)
Kontrolka umożliwiajaca
˛ tworzenie
listy opcji, z której można wybrać
jedna˛ pozycje.
˛
Grupa pól wyboru (klasa CheckboxGroup)
1
2
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 ue ) ;
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" ) ;
}
Cezary Bolek <[email protected]>
⊙
Pole tekstowe (klasa TextField)
1 public class Kont rApl6 extends A p p l e t
2
implements I t e m L i s t e n e r {
3
Label l b l S a l d o ;
4
j a v a . awt . L i s t l s t K o n t a ;
5
Bank PKO=new Bank ( ) ;
6
public void i n i t ( ) {
7
l b l S a l d o =new Label ( "nic nie znazaczono" ) ;
8
l s t K o n t a =new j a v a . awt . L i s t ( 5 ) ;
9
f o r ( i n t n =0; n <100; n++) {
10
Konto k n t ;
11
i f ( n%2==0)
12
k n t =new KontoStandard ( n%5∗100);
13
else
14
k n t =new KontoVIP ( n%5∗100);
15
PKO. dodajKonto ( k n t ) ;
16
l s t K o n t a . add ( k n t . nrKonta ( ) ) ;
17
}
18
add ( l s t K o n t a ) ;
19
add ( l b l S a l d o ) ;
20
lstKonta . addItemListener ( this ) ;
21
}
22
public void itemStateChanged ( ItemEvent ae ) {
23
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 ( ) ;
24
i f ( poz <0) r etu r n ;
25
A r r a y L i s t a l =PKO. l i s t a K o n t ( ) ;
26
Konto k n t =( Konto ) a l . get ( poz ) ;
27
l b l S a l d o . s e t T e x t ( k n t . s aldo ( ) + " zl" ) ;
28
}
29 }
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)
⊳ 98 ⊲
1 public class Kont rApl7 extends A p p l e t
2
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 {
3
double kwota ; Konto k n t ; Label l b l S a l d o , l b l K w o t a ;
4
But t on btnWyplac ; T e x t F i e l d t f dKw ot a ;
5
public void i n i t ( ) {
6
k n t =new KontoStandard ( 1 0 0 0 ) ;
7
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 ) ;
8
t f dKw ot a =new T e x t F i e l d ( 1 0 ) ;
add ( t f dKw ot a ) ;
9
btnWyplac =new But t on ( "Wypłać" ) ;
add ( btnWyplac ) ;
10
l b l K w o t a =new Label ( "wprowadz kwot˛
e" ) ; add ( l b l K w o t a ) ;
11
btnWyplac . a d d A c t i o n L i s t e n e r ( t h i s ) ;
12
t f dKw ot a . a d d T e x t L i s t e n e r ( t h i s ) ;
13
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 ) ;
14
}
15
public void textValueChanged ( TextEvent t e ) {
16
String str ;
17
try {
18
kwota=Double . parseDouble ( t f dKw ot a . g e t T e x t ( ) ) ;
19
i f ( kwota <=0 | | kwota> k n t . s aldo ( ) ) {
20
kwota =0; s t r ="niewłasciwa kwota" ;
21
} else s t r =kwota+" zł" ;
22
}
23
catch ( NumberFormatException e ) {
24
s t r ="zły format" ;
25
}
26
lblKwota . setText ( s t r ) ;
27
}
28
public void ac t ionPerf or m e d ( Ac t ionEv en t ae ) {
29
i f ( kwota <=0) r etu r n ;
30
k n t . wyplac ( kwota ) ;
31
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 ( "" ) ;
32
} }
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 100 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 101 ⊲
Klasa Canvas
1
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.
˛
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
27
Jezyk
˛
Java
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 Fi gur y ( 100 ,100 , Col or .RED, t r ue ) ) ;
add ( new Los Fi gur y ( 100 ,100 , Col or .GREEN, f a l s e ) ) ;
}
}
class Los Fi gur y extends Canvas {
public boolean czyKola = t r ue ;
public Los Fi 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 ) ;
}
} }
Cezary Bolek <[email protected]>
⊙
⊳ 102 ⊲
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
Canvas
Ok
na
Container
Frame
Jezyk
˛
Java
Window
Ko
nt
ro
lk
i
Panel
Choice
TextComponent
TextField
Cezary Bolek <[email protected]>
2
3
4
5
6
7
8
9
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
4
5
6
7
8
9
10
11
12
13
14
15
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 ur n new I n s e t s ( 5 , 1 0 , 1 0 , 1 0 ) ;
}
1
2
7
8
Jezyk
˛
Java
List
TextArea
Ap
l et
Dialog
1
Cezary Bolek <[email protected]>
⊙
⊳ 103 ⊲
Jezyk
˛
Java
Applet
⊙
⊳ 105 ⊲
Jezyk
˛
Java
GridLayout
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 ) ;
}
}
1
2
3
4
5
6
7
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 ) ) ;
}
}
Klasa Insets –
ustawienie odstepu
˛
miedzy
˛
kontrolkami
a brzegami
kontenera
Cezary Bolek <[email protected]>
Menedżery układu (3) – Panele
Component
Checkbox
2
3
5
6
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.
Object
Button
1
3
4
Hierarchia wybranych klas biblioteki AWT
Label
Menedżery układu (2)
BorderLayout
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.
⊙
⊳ 104 ⊲
Okna – (klasa Frame)
1 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 {
2
But t on b t n K o p i u j , bt nWk lej , btnWyczysc ;
3
TextArea t a r T e x t ;
4
S t r i n g schowek=new S t r i n g ( ) ;
5
public void i n i t ( ) {
6
s e t L a y o u t (new BorderLayout ( ) ) ;
7
Panel panel =new Panel ( ) ; panel . s e t L a y o u t (new G ridLay out ( 3 , 0 ) ) ;
8
panel . add ( b t n K o p i u j =new But t on ( "Kopiuj" ) ) ;
9
panel . add ( b t n W k l e j=new But t on ( "Wklej" ) ) ;
10
panel . add ( btnWyczysc=new But t on ( "Wyczysć" ) ) ;
11
add ( panel , BorderLayout .WEST ) ;
12
panel =new Panel ( ) ; panel . s e t L a y o u t (new BorderLayout ( ) ) ;
13
panel . add (new Label ( "Opis:" , Label .CENTER) , BorderLayout .NORTH) ;
14
panel . add ( t a r T e x t =new TextArea ( ) , BorderLayout .CENTER ) ;
15
add ( panel , BorderLayout .CENTER ) ;
16
btnKopiuj . addActionListener ( this ) ;
17
btnWklej . addActionListener ( this ) ;
18
btnWyczysc . a d d A c t i o n L i s t e n e r ( t h i s ) ;
19
}
20
public void ac t ionPerf orm ed ( Ac t ionEv en t ae ) {
21
i f ( ae . getSource ( ) = = btnWyczysc ) {
22
t a r T e x t . s e t T e x t ( "" ) ;
23
}
24
else i f ( ae . getSource ( ) = = b t n K o p i u j ) {
25
schowek= t a r T e x t . g e t S e l e c t e d T e x t ( ) ;
26
}
27
else i f ( ae . getSource ( ) = = b t n W k l e j ) {
28
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 ( ) ) ;
29
}
30
t a r T e x t . requestFocus ( ) ;
31
} }
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.
1
2
3
4
5
6
7
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.
1
1 public class WindowApl2 extends A p p l e t
2
implements A c t i o n L i s t e n e r 2{
3
But t on btnPokaz , b t n U k r y j ;
3
4
MojeOkno okno ;
4
5
public void i n i t ( ) {
5
6
add ( btnPokaz=new But t on ( "Pokaż okno" ) ) ;
6
7
add ( b t n U k r y j =new But t on ( "Ukryj okno" ) ) ;
8
btnPokaz . a d d A c t i o n L i s t e n e r ( t h i s ) ;
7
9
btnUkryj . addActionListener ( this ) ;
8
10
okno=new MojeOkno ( ) ;
9
11
}
10
12
public void ac t ionPerf orm ed ( Ac t ionEv en t ae ) {
11
13
i f ( ae . getSource ( ) = = btnPokaz ) okno . show ( ) ;
14
else okno . hide ( ) ;
12
15
}
13
16 }
14
15
16
17
18
19
20
21
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 Fi 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 Fi gur y ( 0 , 0 , Col or .YELLOW, t r ue ) ;
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
Okna dialogowe
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
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]>
Menu (1)
⊙
Cezary Bolek <[email protected]>
⊙
⊳ 111 ⊲
Jezyk
˛
Java
Cezary Bolek <[email protected]>
5
6
7
12
13
14
15
16
17
18
19
20
21
22
23
24
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 ue ) ;
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 ur 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 ue ;
dispose ( ) ;
}
}
Jezyk
˛
Java
Cezary Bolek <[email protected]>
⊙
⊳ 110 ⊲
Koniec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 }
3
4
8
9
⊳ 109 ⊲
1
2
10
11
Menu (2)
1 class OknoDane extends Frame
2
implements A c t i o n L i s t e n e r ,
3
ItemListener {
4
S t r i n g t e k s t =new S t r i n g ( ) ;
5
MenuItem mnuKoniec , mnuOkrag , mnuProst ;
6
CheckboxMenuItem mnuWypeln ;
7
boolean czyOkrag=true , czyWypel= f a l s e ;
8
f i n a l i n t x =100 , y =60 , dx =50 , dy =50;
9
public OknoDane ( ) {
10
super ( "Figura" ) ;
11
setSize (250 ,150);
12
Menu menu=new Menu ( "Plik" ) ;
13
Menu submenu=new Menu ( "Figura" ) ;
14
mnuOkrag=new MenuItem ( "Okršg" ) ;
15
mnuProst=new MenuItem ( "Prostokšt" ) ;
16
submenu . add ( mnuOkrag ) ;
17
submenu . add ( mnuProst ) ;
18
menu . add ( submenu ) ;
19
mnuWypeln=new CheckboxMenuItem ( "Wypełnij" ) ;
20
mnuKoniec=new MenuItem ( "Koniec" ) ;
21
menu . add ( mnuWypeln ) ;
22
menu . add ( mnuKoniec ) ;
23
MenuBar mb=new MenuBar ( ) ;
24
mb. add ( menu ) ;
25
mnuOkrag . a d d A c t i o n L i s t e n e r ( t h i s ) ;
26
mnuProst . a d d A c t i o n L i s t e n e r ( t h i s ) ;
27
mnuKoniec . a d d A c t i o n L i s t e n e r ( t h i s ) ;
28
mnuWypeln . a d d I t e m L i s t e n e r ( t h i s ) ;
29
setMenuBar (mb ) ;
30
}
Jezyk
˛
Java
// ....
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 ( ) ;
}
// ....
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) —
⊙