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) — ⊙