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