Język Java – część 1 (streszczenie)
Transkrypt
Język Java – część 1 (streszczenie)
Programowanie współbieĪne JĊzyk Java – czĊĞü 1 (streszczenie) Paweł RogaliĔski Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 1 / 81 Podstawowe elementy jĊzyka ¾ Komentarze ¾ słowa kluczowe ¾ Identyfikatory ¾ Typy danych ¾ Operatory ¾ Instrukcje ¾ Klasy i obiekty ¾ Kompozycja i dziedziczenie klas ¾ Klasy abstrakcyjne ¾ Interfejsy JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 2 / 81 Komentarze w Javie Komentarz wierszowy // Program wypisujący tekst powitania Komentarz blokowy /* Program wypisujący tekst powitania Warszawa, 13 listopada 2002 r. */ Komentarz dokumentacyjny /** * Klasa rysująca wykres. Typ wykresu * zaleĪy od naciĞniĊtego przycisku. * @version 1.0 */ class Wykres {... JĊzyka Java cz. 1 3 / 81 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr Słowa kluczowe Słowa kluczowe to słowa, które mają specjalne znaczenie (np. oznaczają instrukcje sterujące) i nie mogą byü uĪywane w innym kontekĞcie niĪ okreĞla składnia jĊzyka. abstract assert boolean break byte case catch char class const continue default do double else extends false final finally float for goto if implements import instanceof int interface long native new null package private protected public return short static strictfp super switch synchronized this throw throws transient true try void volatile while Uwagi: ¾ słowa kluczowe goto i const, są zarezerwowane ale nie są uĪywane. ¾ słowa boolean, byte, char, double, float, int, long, short są nazwami typów podstawowych. ¾ słowa true, false i null są nazwami stałych. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 4 / 81 Identyfikatory Identyfikatory to tworzone przez programistĊ nazwy klas, pól i metod klasy oraz stałych i zmiennych. Identyfikator musi zaczynaü siĊ od litery lub podkreĞlenia i moĪe składaü siĊ z dowolnych znaków alfanumerycznych (liter i cyfr) oraz znaków podkreĞlenia. Java rozróĪnia wielkie i małe litery w identyfikatorach Identyfikator nie moĪe pokrywaü siĊ ze słowami kluczowymi. Zalecenia: ¾ Nazwy klas: wszystkie słowa w nazwie rozpoczynaü duĪą literą, np.: ObiektGraficzny ¾ Nazwy metod i pól publicznych: pierwsze słowo rozpoczynaü małą literą, a kolejne wyrazy duĪą literą, np.: rysujTlo, kolorWypelnienia. ¾ Nazwy metod i pól prywatnych: pisaü wyłącznie małymi literami, a wyrazy łączyü podkreĞleniem, np.: kierunek_ruchu. ¾ Nazwy zmiennych niemodyfikowalnych (stałych): pisaü wyłącznie duĪymi literami, a wyrazy łączyü podkreĞleniem, np.: ROZMIAR_TABLICY. JĊzyka Java cz. 1 5 / 81 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr Typy danych Typ danej to zbiór jej moĪliwych wartoĞci oraz zestaw operacji, które moĪna na nich wykonywaü. JednoczeĞnie okreĞla on rozmiar pamiĊci potrzebny do przechowywania danej oraz sposób zapisu danej w pamiĊci komputera. JĊzyk Java zawiera nastĊpujące typy danych: ¾ typy podstawowe: – typy całkowite: byte, short, int, long, – typy rzeczywiste: float, double, – typ znakowy: char, – typ logiczny: boolean, ¾ typ wyliczeniowy ¾ typ referencyjny – nazwy typu referencyjnego pochodzą od nazwy klasy lub interfejsu. WartoĞcią zmiennej typu referencyjnego jest referencja (odniesienie) do obiektu. Dane w programie przedstawiamy za pomocą literałów, zmiennych oraz stałych. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 6 / 81 Typy podstawowe Typy podstawowe reprezentują pojedyncze wartoĞci – nie są one złoĪonymi obiektami. Zapewnia to bardzo duĪą wydajnoĞü przy wykonywaniu obliczeĔ. Rozmiar i zakres wartoĞci typów podstawowych nazwa typu zajĊtoĞü pamiĊci zakres wartoĞci wartoĞü domyĞlna znaczenie byte 1 od -128 do 127 0 short 2 od -32768 do 32767 0 int 4 od ok. -2×10 do ok. 2×10 long 8 od ok. -9×1018 do ok. 9×1018 float 4 od ok. -3.4×1038 do ok. 3.4×1038 0.0F double 8 od ok. -1.7×10308 do ok. 1.7×10308 0.0D char 2 od 0 do 65535 ‘x0’ znaki unicode boolean 1 false,true false wartoĞci logiczne JĊzyka Java cz. 1 9 9 0 liczby całkowite 0 liczby rzeczywiste Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 7 / 81 Typy wyliczeniowe ¾ Wyliczenia tworzy siĊ za pomocą słowa kluczowego enum, np.: enum Kolor { Zielony, Zolty, Czerwony } ¾ Identyfikatory Zielony, Zolty, Czerwony nazywany stałymi wyliczeniowymi. Są one publicznymi statycznymi składowymi wyliczenia i posiadają taki sam typ jak wyliczenie ¾ W programie moĪna deklarowaü zmienne wyliczeniowe, którym moĪna przypisywaü stałe wyliczenia, np.: Kolor kol; kol = Kolor.Zielony. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 8 / 81 Operatory Operatory są to specjalne symbole stosowane do wykonywania działaĔ arytmetycznych, przypisaĔ, porównaĔ i innych operacji na danych. Dane, na których są wykonywane operacje są nazywane argumentami. Operatory są jedno, dwu lub trzyargumentowe. Uwaga: Niektóre operatory mogą byü stosowane zarówno jako jednoargumentowe jak i dwuargumentowe np. + . KaĪdy operator moĪe byü stosowany wyłącznie do danych okreĞlonego typu. Wynik działania operatora jest okreĞlonego typu. Uwaga: Dla niektórych operatorów typ wyniku zaleĪy od typu argumentów. WyraĪenia tworzy siĊ za pomocą operatorów i nawiasów ze zmiennych, stałych, literałów oraz wywołaĔ metod. WyraĪenia są opracowywane (wyliczane), a ich wyniki mogą byü w róĪny sposób wykorzystane np. w przypisaniach, jako argumenty innych operatorów, w instrukcjach sterujących wykonaniem programu, w wywołaniach metod, itd. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 9 / 81 Operatory cd. KolejnoĞü opracowywania (wyliczania) wyraĪeĔ zaleĪy od priorytetów i wiązaĔ operatorów uĪytych w tych wyraĪeniach. Priorytety mówią o tym, w jakiej kolejnoĞci bĊdą wykonywane róĪne operacje w tym samym wyraĪeniu. Przykład: W wyraĪeniu a+b*c najpierw bĊdzie wykonane mnoĪenie, a potem dodawanie poniewaĪ operator * ma wyĪszy priorytet niĪ operator +. ĩeby odwróciü kolejnoĞü wykonywania działaĔ trzeba uĪyü nawiasów: (a+b)*c Wiązania okreĞlają kolejnoĞü wykonywania operacji o tym samym priorytecie tzn. czy są one wykonywane od lewej strony wyraĪenia czy od prawej. Przykład: W wyraĪeniu a-b+c najpierw bĊdzie wykonane odejmowanie, a potem dodawanie bo wiązanie operatorów + i – jest lewostronne. ĩeby odwróciü kolejnoĞü wykonywania działaĔ trzeba uĪyü nawiasów: a-(b+c) JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 10 / 81 Zestawienie operatorów dostĊpnych w Javie lewe wiązanie i priorytet 1 2 operator sposób uĪycia działanie . [ ] ( ) ++ obiekt.składowa tablica[wyraĪenie] metoda(lista wyraĪeĔ) zmienna++ ++zmienna zmienna---zmienna +wyraĪenie -wyraĪenie !wyraĪenie ~wyraĪenie (typ)wyraĪenie new typ wyraĪenie*wyraĪenie wyraĪenie/wyraĪenie wyraĪenie%wyraĪenie wybór składowej klasy indeks tablicy wywołanie metody przyrostkowe / przedrostkowe zwiĊkszenie o 1 przyrostkowe / przedrostkowe zmniejszenie o 1 jednoargumentowy plus, jednoargumentowy minus negacja logiczna dopełnienie bitowe rzutowanie typu tworzenie obiektu mnoĪenie, dzielenie, modulo lewe prawe -- 3 + ! ~ (typ) new * / % JĊzyka Java cz. 1 lewe lewe wiązanie i priorytet 4 5 lewe 6 lewe 7 8 9 10 11 12 13 JĊzyka Java cz. 1 11 / 81 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr operator + sposób uĪycia wyraĪenie+wyraĪenie wyraĪenie-wyraĪenie << wyraĪenie<<wyraĪenie >> wyraĪenie>>wyraĪenie >>> wyraĪenie>>>wyraĪenie < wyraĪenie<wyraĪenie <= wyraĪenie<=wyraĪenie > wyraĪenie>wyraĪenie >= wyraĪenie>=wyraĪenie instanceof obiekt instanceof klasa == wyraĪenie==wyraĪenie != wyraĪenie!=wyraĪenie & wyraĪenie&wyraĪenie ^ wyraĪenie^wyraĪenie | wyraĪenie|wyraĪenie && wyraĪenie&&wyraĪenie || wyraĪenie||wyraĪenie ? : wyraĪ ? wyraĪ : wyraĪ działanie dodawanie, łączenie łaĔcuchów, odejmowanie przesuniĊcie bitowe w lewo przesuniĊcie bitowe w prawo przes. bitowe w prawo bez znaku mniejsze, mniejsze lub równe, wiĊksze, wiĊksze lub równe stwierdzenie typu obiektu równoĞü, nierównoĞü bitowe AND bitiwe OR wyłączające bitiwe OR logiczne AND logiczne OR operator warunku Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 12 / 81 wiązanie i priorytet prawe 14 operator sposób uĪycia = *= /= %= += -= <<= >>= >>>= zmienna=wyraĪenie zmienna*=wyraĪenie zmienna/=wyraĪenie zmienna%=wyraĪenie zmienna+=wyraĪenie zmienna-=wyraĪenie zmienna<<=wyraĪenie zmienna>>=wyraĪenie &= ^= |= JĊzyka Java cz. 1 zmienna>>>=wyraĪenie zmienna&=wyraĪenie zmienna^=wyraĪenie zmienna|=wyraĪenie działanie proste przypisanie pomnóĪ i przypisz podziel i przypisz oblicz modulo i przypisz dodaj i przypisz odejmij i przypisz przesuĔ w lewo i przypisz przesuĔ w prawo i przypisz przesuĔ w prawo bez znaku i przypisz koniunkcja bitowa i przypisz róĪnica bitowa i przypisz alternatywa bitowa i przypisz Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 13 / 81 Operatory przypisania Operator przypisania = oblicza wartoĞü wyraĪenia po prawej stronie, a nastĊpnie przypisuje obliczoną wartoĞü do zmiennej umieszczonej po lewej stronie. Uwaga: Działanie operatora dla typów prostych jest zgodne z intuicją. JeĞli a i b są zmiennymi typu prostego to instrukcja a=b powoduje skopiowanie wartoĞci zmiennej b do a. PóĨniejsza modyfikacja zmiennej b nie wpływa na wartoĞü zmiennej a. JeĞli zmienne a i b są typu referencyjnego (zawierają odwołanie do obiektu) to wykonanie instrukcji a=b powoduje skopiowanie do zmiennej a referencji do obiektu wskazywanego przez zmienną b. W efekcie zmienne a i b wskazują na ten sam obiekt. PóĨniejsza modyfikacja obiektu wskazywanego przez b powoduje równieĪ modyfikacjĊ obiektu wskazywanego przez a. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 14 / 81 Operator przypisania - przykład dla typów prostych i referencyjnych class Test { int p; Test(int p){ this.p=p; } public String toString(){ return ""+p; } public static void main(String[] args){ System.out.println("Inicjalizacja:"); int zmA = 10; int zmB = 15; Test obA = new Test(10); Test obB = new Test(15); System.out.println("zmA = " +zmA+ " zmB = "+zmB); System.out.println("obA = " +obA+ " obB = "+obB); System.out.println("\nPrzypisanie:"); zmA = zmB; obA = obB; System.out.println("zmA = " +zmA+ " zmB = "+zmB); System.out.println("obA = " +obA+ " obB = "+obB); System.out.println("\nModyfikacja:"); zmB = 20; obB.p = 20; System.out.println("zmA = " +zmA+ " zmB = "+zmB); System.out.println("obA = " +obA+ " obB = "+obB); } } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 15 / 81 Operator przypisania - przykład dla typów prostych i referencyjnych // Inicjalizacja int zmA = 10; int zmB = 15; Test obA = new Test(10); Test obB = new Tesy(20); // Przypisanie zmA = zmB; obA = obB; zmA obA 10 zmB 10 obB 15 zmA 15 obA 15 zmB 10 obB 15 // Modyfikacja zmB = 20; obB.p = 20; zmA obA 15 zmB 20 JĊzyka Java cz. 1 15 10 obB 20 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 16 / 81 Rodzaje instrukcji w jĊzyku Java Instrukcja pusta – nie powodujĊ wykonania Īadnych działaĔ np. ; Instrukcje wyraĪeniowe: ¾ przypisanie np. a = b; ¾ preinkrementacja np. ++a; ¾ predekrementacja np. --b; ¾ postinckrementacja np. a++; ¾ postdekrementacja np. b--; ¾ wywołanie metody np. x.metoda(); ¾ wyraĪenie new np. new Para(); Uwaga: instrukcja wyraĪeniowa jest zawsze zakoĔczona Ğrednikiem. Instrukcja grupująca – dowolne instrukcje i deklaracje zmiennych ujĊte w nawiasy klamrowe np. { int a,b; a = 2*a+b; } Uwaga: po zamykającym nawiasie nie stawiamy Ğrednika. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 17 / 81 Rodzaje instrukcji w jĊzyku Java cd. Instrukcja etykietowana – identyfikator i nastĊpujący po nim dwukropek wskazujący instrukcje sterującą switch, for, while lub do. Instrukcja sterująca – umoĪliwia zmianĊ sekwencji instrukcji programu. RozróĪniamy instrukcje: ¾ warunkowe: if, if ... else, switch ¾ iteracyjne: for, while, do ... while ¾ skoku: break, continue, return (kolejnoĞci) wykonania innych Instrukcja throw – zgłaszanie wyjątku przerywającego normalny tok działania programu. Instrukcja synchronized – wymuszanie synchronizacji przy współbieĪnym wykonywaniu róĪnych wątków programu JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 18 / 81 Postaü instrukcji warunkowej if Instrukcja warunkowa if słuĪy do zapisywania decyzji, gdzie wykonanie instrukcji jest uzaleĪnione od spełnienia jakiegoĞ warunku. if (warunek) { instrukcja; } warunek fałsz prawda instrukcja JĊzyka Java cz. 1 19 / 81 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr Postaü instrukcji warunkowej if - else Instrukcja warunkowa if ... else słuĪy do zapisywania decyzji, gdzie wykonanie jednej z alternatywnych instrukcji zaleĪy od spełnienia jakiegoĞ warunku. JeĞli warunek jest prawdziwy to wykonywana jest instrukcja1, w przeciwnym wypadku wykonywana jest instrukcja2. if (warunek) { instrukcja1; } else { instrukcja2; } JĊzyka Java cz. 1 prawda warunek instrukcja1 fałsz instrukcja2 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 20 / 81 Przykład - instrukcja if ... else import javax.swing.JOptionPane; class PrzykladIf { public static void main(String[] args) { double a, b, c, delta, x1, x2; a = Double.parseDouble(JOptionPane.showInputDialog(null, "Podaj b = Double.parseDouble(JOptionPane.showInputDialog(null, "Podaj c = Double.parseDouble(JOptionPane.showInputDialog(null, "Podaj System.out.println("\n" + a + " x^2 + " + b + " x + " + c + " = a:")); b:")); c:")); 0"); if (a<0) { System.out.println("\n To nie jest równanie kwadratowe"); System.exit(0); } delta = b*b-4*a*c; System.out.println("\n delta=" + delta); if (delta>0){ x1 = (-b - Math.sqrt(delta))/(2*a); x2 = (-b + Math.sqrt(delta))/(2*a); System.out.println("\n x1=" + x1 + " x2=" + x2); } else if (delta==0){ x1 = -b/(2*a); System.out.println("\n x1=" + x1); } else System.out.println("\n To równanie nie ma pierwiastków"); } } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr Postaü instrukcji wyboru 21 / 81 switch Instrukcja wyboru switch pozwala zapisywaü decyzje, kiedy to o wyborze jednej z alternatyw decyduje wartoĞü skalarna jakiegoĞ wyraĪenia testowego. WyraĪenie to musi byü typu całkowitego, znakowego lub wyliczeniowego. Jego wynik jest porównywany z wyraĪeniami stałymi (np. literałami) wystĊpującymi po słowie kluczowym case. W przypadku zgodnoĞci wykonywana jest odpowiednia instrukcja po dwukropku i nastĊpujące po niej kolejne instrukcje aĪ do napotkania instrukcji break lub return. JeĞli Īadne z wyraĪeĔ stałych po słowie case nie jest zgodne z wartoĞcią wyraĪenia testowego to wykonywana jest instrukcja po klauzuli default. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 22 / 81 Postaü instrukcji wyboru switch switch (test) { case wartoĞü1: instrulcje1; break; case wartoĞü2: instrukcje2; case wartoĞü3: instrukcje3; case wartoĞü4: instrukcje4; break; case wartoĞü5: instrukcje5; break; ... ... default: instrukcje-n; } JĊzyka Java cz. 1 test wartoĞü1 instrukcje1 wartoĞü2 instrukcje2 wartoĞü3 instrukcje3 wartoĞü4 instrukcje4 wartoĞü5 instrukcje5 ... inna wartoĞü ... instrukcje-n Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 23 / 81 Przykład – instrukcja switch import javax.swing.JOptionPane; class PrzykladSwitch{ public static void main(String[] args){ double a, b; char oper; a=Double.parseDouble(JOptionPane.showInputDialog(null, "Podaj a")); b=Double.parseDouble(JOptionPane.showInputDialog(null, "Podaj b")); oper=JOptionPane.showInputDialog(null, "Podaj działanie").charAt(0); System.out.println("a=" + a + " b=" + b + " oper=" + oper); switch(oper){ case '+': System.out.println(" Suma break; case '-': System.out.println("Roznica break; case '*': System.out.println("Iloczyn break; case '/': System.out.println(" Iloraz break; default: System.out.println("Nieznana } System.out.println("Koniec \n"); wynosi " + (a+b)); wynosi " + (a-b)); wynosi " + (a*b)); wynosi " + (a/b)); operacja"); } } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 24 / 81 Postaü pĊtli while W nagłówku pĊtli while zapisywany jest warunek, który jest testowany przed wykonaniem kaĪdej iteracji. Dopóki ten warunek jest prawdziwy, powtarzane jest wykonanie instrukcji. Gdy warunek nie jest spełniony wykonanie pĊtli koĔczy siĊ. Uwaga: JeĞli warunek nie bĊdzie spełniony juĪ na wstĊpie, to instrukcja w pĊtli while nie bĊdzie wykonana ani razu while (warunek) { instrukcja; } warunek fałsz prawda instrukcja JĊzyka Java cz. 1 25 / 81 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr Postaü pĊtli do ... while PĊtla do ... while słuĪy do zapisywania iteracji wykonywanej przynajmniej raz. Instrukcja w pĊtli jest wykonywana, po czym sprawdzany jest warunek powtórzenia. JeĞli warunek jest spełniony to instrukcja w pĊtli jest wykonywana ponownie. W przeciwnym razie wykonanie pĊtli koĔczy siĊ. Uwaga: Instrukcja w pĊtli do ... while zawsze wykona siĊ co najmniej jeden raz. do { instrukcja; } while(warunek); instrukcja prawda warunek fałsz JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 26 / 81 Postaü pĊtli for W nagłówku pĊtli for podawane są: inicjalizacja, warunek powtórzenia oraz aktualizacja. Inicjalizacja jest wykonywana przed rozpoczĊciem wykonywania pĊtli. inicjalizacja Warunek jest sprawdzany przed kaĪdą iteracją i jeĞli jest spełniony wykonywana jest instrukcja wewnątrz pĊtli i nastĊpująca po niej aktualizacja. W przeciwnym razie warunek fałsz pĊtla jest przerywana. prawda for(inicjalizacja; warunek; aktualizacja) { instrukcja; } JĊzyka Java cz. 1 instrukcja aktualizacja Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 27 / 81 Porównanie instrukcji iteracyjnych PĊtle while oraz do ...while stosujemy zwykle wtedy, gdy kontynuacja działania pĊtli zaleĪy od jakiegoĞ warunku, a liczba iteracji nie jest z góry znana lub jest trudna do okreĞlenia. PĊtla for jest stosowana najczĊĞciej przy organizacji pĊtli iteracyjnych ze znanym zakresem iteracji. PĊtle for moĪna łatwo przekształciü na pĊtlĊ while. Ilustruje to poniĪsze zastawienie: for (inicjalizacja; warunek; aktualizacja) { instrukcja; } JĊzyka Java cz. 1 inicjalizacja; while(warunek) { instrukcja; aktualizacja; } Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 28 / 81 Przerywanie pĊtli – instrukcja break Instrukcja break powoduje przerwanie wykonywania pĊtli. W przypadku pĊtli zagnieĪdĪonych przerywana jest pĊtla wewnĊtrzna, w której bezpoĞrednio znajduje siĊ instrukcja break. JeĞli po instrukcji break wystĊpuje etykieta, to przerywana jest ta pĊtla lub blok instrukcji, która jest opatrzona tą etykietą. Uwaga: etykieta musi byü umieszczona bezpoĞrednio przed pĊtlą lub blokiem instrukcji, które mają byü przerwane. Instrukcja break stosowana jest równieĪ do opuszczania instrukcji switch. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 29 / 81 Kontynuowanie pĊtli – instrukcja continue Instrukcja continue przerywa wykonywanie bieĪącego kroku pĊtli i wznawia wykonanie kolejnej iteracji. W przypadku pĊtli zagnieĪdĪonych działanie to dotyczy tej pĊtli wewnĊtrznej, w której jest umieszczona instrukcja continue. JeĞli po instrukcji continue wystĊpuje etykieta, to wznawiana jest iteracja tej pĊtli, która jest opatrzona tą etykietą. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 30 / 81 Klasy i obiekty Java jest jĊzykiem obiektowym. JĊzyki obiektowe posługują siĊ pojĊciem obiektu i klasy. Obiekt to konkretny lub abstrakcyjny byt, wyróĪnialny w modelowanej rzeczywistoĞci, posiadający okreĞlone właĞciwoĞci (atrybuty) oraz mogący Ğwiadczyü okreĞlone usługi (metody), czyli wykonywaü okreĞlone działania lub przejawiaü okreĞlone zachowania. Obiekty współdziałają ze sobą wymieniając komunikaty, które Īądają wykonania okreĞlonych usług (metod). Klasa to mający nazwĊ opis pewnego rodzaju bytów posiadających takie same cechy (byty te nazywamy obiektami lub instancjami klasy). Wspólne cechy to atrybuty (pola) poszczególnych obiektów oraz operacje (metody), które moĪna na obiektach wykonywaü. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 31 / 81 Klasy i obiekty cd. Definicja klasy okreĞla: ¾ zestaw cech (atrybutów) obiektów klasy, ¾ zestaw operacji, które moĪna wykonywaü na obiektach klasy, ¾ specjalne operacje, które pozwalają na inicjowanie obiektów przy ich tworzeniu. Wspólne cechy (atrybuty) obiektów nazywane są polami klasy. Operacje wykonywane na obiektach nazywane są metodami. Specjalne operacje inicjalizacji przy tworzeniu obiektów nazywane są konstruktorami. Pola i metody (wraz z konstruktorami) nazywane są składowymi klasy. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 32 / 81 Klasy i obiekty cd. KlasĊ przedstawia siĊ w formie prostokąta podzielonego na trzy czĊĞci: ¾Ğrodkowa czĊĞü przedstawia atrybuty obiektów, atrybuty obiektów klasy (pola klasy) ¾ dolna czĊĞü przedstawia konstruktory oraz konstruktory oraz metody obiektów metody obiektów. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr składowe klasy ¾ górna czĊĞü zawiera nazwĊ klasy, Nazwa klasy 33 / 81 Klasy i obiekty cd. Ogólna postaü definicji klasy w jĊzyku Java: public class NazwaKlasy { [spDostĊpu] typ nazwaPola; ... [spDostĊpu] typ nazwaMetody(lista_parametrów) { definicja_funkcji } ... } Uwagi: ¾ modyfikator dostĊpu public przed słowem class moĪe nie wystĊpowaü, ¾ modyfikatory [spDostĊpu] okreĞlają dostĊpnoĞü pól i metod. ¾ nagłówek i definicja metody w całoĞci muszą znajdowaü siĊ w klasie. ¾ definicja klasy nie jest zakoĔczona Ğrednikiem. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 34 / 81 Przykładowa definicja klasy ParaLiczb class ParaLiczb { // definicja pól int a; int b; // definicja konstruktora ParaLiczb() { a = 0; b = 0; } // definicja metody suma int suma() { return a+b; } // definicja metody iloczn int iloczyn() { return a*b; } } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 35 / 81 Obiekty i referencje do obiektów Obiekty są instancjami (egzemplarzami) klasy. Do obiektów moĪna odwoływaü siĊ w programie za pomocą referencji. Referencja to wartoĞü, która oznacza lokalizacjĊ (adres) obiektu w pamiĊci. Referencje mogą byü pamiĊtane w zmiennych referencyjnych, np.: ParaLiczb para; Zmienne referencyjne mogą zawieraü referencje do obiektów lub nie zawieraü Īadnej referencji (nie wskazywaü na Īaden obiekt). Zmienna, która nie zawiera referencji do obiektu ma wartoĞü null. Uwaga: ¾ Zmiennej referencyjnej moĪna przypisywaü wyłącznie referencje do obiektu lub wartoĞü null. ¾ Referencje moĪna porównywaü wyłącznie za pomocą operatorów == lub !=. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 36 / 81 Obiekty i referencje do obiektów Deklaracja zmiennej referencyjnej nie tworzy obiektu tzn. nie wydziela pamiĊci do przechowywania obiektu klasy. Obiekt musi byü jawnie utworzony za pomocą operatora new, który zwraca referencjĊ do obiektu. Ta referencja moĪe zostaü przypisana zmiennej referencyjnej, np.: para = new ParaLiczb(); ParaLiczb a b para JĊzyka Java cz. 1 obiekt klasy ParaLiczb referencja zmienna referencyjna Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 37 / 81 Definiowanie pól klasy Pola (atrybuty) klasy deklarujemy jako zmienne wewnątrz klasy. Deklaracja moĪe zawieraü modyfikator dostĊpu (np. private, protected lub public), oraz wyraĪenie inicjujące, np.: private float wartoĞü = 100.0f; Uwaga: nazwy pól zwykle piszemy małymi literami. Pola ustalone zawierają w deklaracji dodatkowy modyfikator final, np.: final int ROZMIAR_CZCIONKI = 14; Uwaga: nazwy pól ustalonych zwykle piszemy DUĩYMI_LITERAMI. Pola klasy, które wartoĞci domyĞlne: nie mają przypisanej wartoĞci pola typu całkowitego (np. typu int) pola typu rzeczywistego (np. typu float) pola typu logicznego pola typu referencyjnego JĊzyka Java cz. 1 – – – – początkowej bĊdą miały liczbĊ 0, liczbĊ 0.0 wartoĞü false, wartoĞü null. Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 38 / 81 Odwołania do pól klasy Do pól klasy odwołujemy siĊ za pomocą operatora selekcji . referencja_do_obiektu.nazwa_pola np. para.a Uwaga: JeĞli odwołujemy siĊ do pola bieĪącego obiektu (np. w metodzie wywołanej na rzecz tego obiektu), które nie zostało przesłoniĊte, to moĪna odwoływaü siĊ z pominiĊciem zmiennej referencyjnej i operatora selekcji . . class ParaLiczb { int a, b; odwołanie do pola a int getA() { return a; } } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 39 / 81 Odwołania do pól klasy cd. Uwaga: JeĞli odwołujemy siĊ do pola bieĪącego obiektu (np. w metodzie wywołanej na rzecz tego obiektu), które zostało przesłoniĊte przez zmienną lokalną, to do pola moĪna odwoływaü siĊ za pomocą słowa this np.: class ParaLiczb { int a, b; int setA(int a) { this.a = a; } } JĊzyka Java cz. 1 deklaracja pola a parametr a przesłania zasiĊg pola a odwołanie do pola a Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 40 / 81 Definiowane metod w klasie modyfikator dostĊpu typ wyniku nazwa metody lista parametró parametrów public int obliczSume(int a, int b) { int c = a+b; ciało metody return c; } nagłówek metody zwracany wynik ¾ nagłówek i ciało metody w całoĞci muszą znajdowaü siĊ w klasie. ¾ nazwĊ metody zaczynamy od małej litery i dalej stosujemy notacjĊ wĊgierską np. dodaj, obliczSume. ¾ modyfikator dostĊpu okreĞla czy metoda moĪe byü wywoływana spoza klasy, w której jest zdefiniowana. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 41 / 81 Definiowane metod w klasie cd. ¾ typ wyniku okreĞla typ danych zwracanych przez metodĊ. JeĞli metoda nic nie zwraca to zapisujemy void. ¾ JeĞli metoda zwraca wynik to zakoĔczenie działania metody powinno nastĊpowaü na skutek instrukcji return. ¾ lista parametrów zawiera deklaracje parametrów, które są przekazywane do metody przy wywołaniu. Lista ta moĪe byü pusta (metoda bezparametrowa). JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 42 / 81 Konstruktory Konstruktor to specjalna metoda, która słuĪy (głównie) do inicjowania pól obiektów. Konstruktor ¾ zawsze ma nazwĊ taką samą jak nazwa klasy, ¾ nie ma Īadnego typu wyniku (nawet void), ¾ ma listĊ parametrów (w szczególnoĞci moĪe byü pusta). ¾ jest zawsze wywoływany za pomocą wyraĪenia new Uwaga: W klasie moĪe byü zdefiniowanych wiele przeciąĪonych konstruktorów, które róĪnią siĊ listą parametrów. JeĞli w klasie nie zdefiniowano Īadnego konstruktora to jest tworzony domyĞlny konstruktor bezparametrowy, który inicjuje pola obiektu wartoĞciami domyĞlnymi. Konstruktor domyĞlny nie jest dodawany, gdy w klasie zdefiniowano jakikolwiek inny konstruktor. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 43 / 81 Konstruktory – przykład class Towar private private private { String nazwa; double cena; int ilosc; public Towar() { nazwa = "nieznany"; cena = 0.0; ilosc = 0; } public Towar(String nazwa) { this(); this.nazwa = nazwa; } wywołanie konstruktora bezparametrowego public Towar(String nazwa, double cena, int ilosc) { this(nazwa); this.cena = cena; this.ilosc = ilosc; } wywołanie konstruktora z jednym parametrem public static void main(String [] args) { Towar t1, t2, t3, t4; t1 = new Towar(); wywołanie konstruktora bezparametrowego wywołanie konstruktora z jednym parametrem t2 = new Towar("Zeszyt"); t3 = new Towar("Blok rysunkowy", 2.50, 5); } wywołanie konstruktora z trzema parametrami } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 44 / 81 Pola i metody statyczne Wszystkie pola niestatyczne istnieją w kaĪdym obiekcie bĊdącym instancją klasy. tzn. kaĪdy obiekt posiada własny indywidualny zestaw atrybutów opisujących jego właĞciwoĞci. Pola statyczne dotyczą całej klasy, a nie poszczególnych obiektów – są one pamiĊtane w specjalnym obszarze pamiĊci wspólnym dla całej klasy. Składowe statyczne stanowią właĞciwoĞci całej klasy, a nie poszczególnych obiektów. Składowe statyczne (pola i metody): ¾ są deklarowane przy uĪyciu specyfikatora static ¾ mogą byü uĪywane nawet wtedy, gdy nie istnieje Īaden obiekt klasy. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 45 / 81 Pola i metody statyczne cd. Do składowych statycznych klasy odwołujemy siĊ za pomocą operatora selekcji . NazwaKlasy.nazwa_składowej JeĪeli istnieje jakiĞ obiekt to do składowej statycznej moĪna siĊ równieĪ odwoływaü tak, jak do zwykłej składowej (tzn. poprzez podanie referencji do obiektu) referencja_do_obiektu.nazwa_składowej Wewnątrz klasy do składowych statycznych moĪna odwoływaü siĊ w uproszczony sposób podając tylko ich nazwĊ. Uwaga: Ze statycznych metod nie wolno odwoływaü siĊ do niestatycznych składowych klasy podając ich nazwĊ (obiekt moĪe nie istnieü). MoĪliwe są natomiast odwołania do innych składowych statycznych. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 46 / 81 Pola i metody statyczne – przykład class Towar { private static int vat = 0; static void ustawVAT(int vat) { Towar.vat = vat; System.out.printf("\nVAT wynosi %d\n\n", vat); } private String nazwa = "nieznany"; private double cena = 0.0; private int ilosc = 0; Towar(String nazwa, double cena, int ilosc) { this.nazwa = nazwa; this.cena = cena; this.ilosc = ilosc; } pole statyczne metoda statyczna pola niestatyczne konstruktor double obliczWartoscNetto() { return cena * ilosc; } metody niestatyczne double obliczVAT() { return cena*ilosc*vat/100; } double obliczWartoscBrutto() { return obliczWartoscNetto() + obliczVAT(); } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 47 / 81 Pola i metody statyczne – przykład cd. public String toString() { return String.format("%10s %7.2f*%d + %2d%% VAT -> %7.2f", nazwa, cena, ilosc, vat, obliczWartoscBrutto()); } metody niestatyczne public void drukuj() { System.out.println(this); } public static void main(String[] args) { // nazwa = ”Towar”; // cena = 100.0; // ilosc = 1; // drukuj(); w metodzie statycznej nie wolno odwoływaü siĊ do pól i metod niestatycznych Towar t1 = new Towar("Atlas ", 12.50, 2); Towar t2 = new Towar("Zeszyt A4", 2.40, 5); ustawVAT(0); wywołania metody statycznej t1.drukuj(); t2.drukuj(); Towar.ustawVAT(7); t1.drukuj(); t2.drukuj(); t1.ustawVAT(22); t1.drukuj(); t2.drukuj(); wywołania metody niestatycznej dla obiektów t1 i t2 } } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 48 / 81 Związki miĊdzy klasami: „jest” i „zawiera” Przkład: Pojazd Pojazd silnikowy Silnik Silnik elektryczny Wóz konny Silnik spalinowy Motocykl Pojazd silnikowy Motocykl Rower Samochód jest szczególnym rodzajem Pojazdu jest szczególnym rodzajem Pojazdu silnikowego Pojazd silnikowy JĊzyka Java cz. 1 zawiera Silnik 49 / 81 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr Ponowne wykorzystanie klas Przy tworzeniu nowych klas moĪna wykorzystywaü juĪ istniejące klasy za pomocą: ¾kompozycji, ¾dziedziczenia. KompozycjĊ stosuje siĊ wtedy, gdy miĊdzy klasami zachodzi relacja typu „całoĞü ↔ czĊĞü” tzn. nowa klasa zawiera w sobie istniejącą klasĊ. Dziedziczenie stosuje siĊ wtedy, gdy miĊdzy klasami „generalizacja ↔ specjalizacja” tzn. nowa klasa zachodzi relacja jest szczególnym rodzajem juz istniejącej klasy. Uwaga: Zwykle tworzy siĊ nowe klasy wykorzystując jednoczeĞnie kompozycjĊ i dziedziczenie np.: klasa Pojazd silnikowy jest uszczegółowieniem klasy Pojazd oraz zawiera w sobie klasĊ Silnik. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 50 / 81 Kompozycja KompozycjĊ uzyskujemy poprzez definiowanie w nowej klasie pól, które są obiektami istniejących klas. Przykład: Klasa Osoba zawiera: ¾ pola nazwisko i imie, które naleĪą do klasy String. Klasa Ksiązka zawiera: ¾ pole autor naleĪące do klasy Osoba, ¾ pole tytul naleĪące do klasy String, ¾ pole cena typu double. JĊzyka Java cz. 1 51 / 81 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr Kompozycja - definicja klasy Osoba oraz Ksiazka class Osoba { private String nazwisko, imie; public Osoba(String nazwisko, String imie) { this.nazwisko = nazwisko; this.imie = imie; } public String podajNazwisko() { return nazwisko; } public String podajImie() { return imie; } } class Ksiazka { private Osoba autor; private String tytul; double cena; public Ksiazka(Osoba autor, String tytul, double cena) { this.autor = autor; this.tytul = tytul; this.cena = cena; } public Osoba podajAutor() { return autor; } public String podajTytul() { return tytul; } public double podajCena() { return cena; } } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 52 / 81 Kompozycja cd. Przykładowa instrukcja tworząca nowy obiekt klasy Ksiazka: Ksiazka lektura = new Ksiazka( new Osoba(”Sienkiewicz”, ”Henryk”), ”Potop”, 32.5 ); lektura Osoba Ksiazka autor tytul cena nazwisko imie String ”Sienkiewicz” String ”Henryk” 32.5 String ”Potop” JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 53 / 81 Dziedziczenie Dziedziczenie polega na przejĊciu właĞciwoĞci i funkcjonalnoĞci obiektów innej klasy i ewentualnej modyfikacji tych właĞciwoĞci i funkcjonalnoĞci w taki sposób, by były one bardziej wyspecjalizowane. Do wyraĪania relacji dziedziczenia jednej klasy przez drugą słuĪy słowo kluczowe extends class B extends A { ... } Klasa B dziedziczy (rozszerza) klasĊ A, tzn. ¾ klasa A jest klasą bazową, (superklasą) klasy B ¾ klasa B jest klasą pochodną klasy A JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 54 / 81 Dziedziczenie cd. Przykład: Klasa Publikacja zawiera: ¾ pole tytul z klasy String i pole cena typu double. Klasa Ksiązka dziedziczy po klasie Publikacja i dodatkowo zawiera: ¾ pole autor naleĪące do klasy String. Klasa Czasopismo dziedziczy po klasie Publikacja i dodatkowo zawiera: ¾ pole numer typu int. JĊzyka Java cz. 1 55 / 81 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr Dziedziczenie cd. Przykładowe instrukcje tworzące nowe obiekty klas Ksiazka i Czasopismo: Ksiazka lektura = new Ksiazka(”Bolesław Prus”, ”Lalka”, 22.50 ); Czasopismo gazeta = new Czasopismo(”Przektój”, 12, 3.90 ); lektura gazeta JĊzyka Java cz. 1 Ksiazka tytul cena 22.50 autor Publikacja(...) podajTytul() podajCena() Ksiazka(...) podajAutor() String String ”Lalka” ”Bolesław Prus” Czasopismo tytul cena 3.90 numer 12 Publikacja(...) podajTytul() podajCena() Czasopismo(...) podajNumer() Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr String ”Przekrój” 56 / 81 Inicjowanie obiektów przy dziedziczeniu Pola klasy bazowej moĪna inicjowaü za pomocą wywołania z konstruktora klasy pochodnej konstruktora klasy bazowej: super(args); gdzie args jest listą argumentów przekazanych do konstruktora klasy bazowej JeĞli konstrukcja super(...) wystĊpuje, MUSI byü pierwszą instrukcją konstruktora klasy pochodnej. Gdy nie wystĊpuje, przed wykonaniem kodu klasy pochodnej zostanie wywołany konstruktor bezparametrowy klasy bazowej. Przykład: Czasopismo(String tytul, int numer, double cena) { super(tytul, cena); Wywołanie konstruktora this.numer = numer; klasy bazowej } JĊzyka Java cz. 1 57 / 81 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr PrzeciąĪanie metod PrzeciąĪanie metod w klasie polega na definiowaniu wielu metod o tej samej nazwie ale odmiennej liĞcie parametrów. PrzeciąĪane mogą byü zarówno konstruktory jak i metody statyczne i niestatyczne. Przykład: class Para { int a, b; Para() { System.out.println(" Konstruktor bezparametrowy"); a = b = 0; } PrzeciąĪone PrzeciąĪone konstruktory konstruktory Para(int x, int y) { System.out.println(" Konstruktor z parametrami"); a = x; b = y; } void pokaz() { System.out.println("Metoda bez parametru"); System.out.println("Para("+ a +", "+ b +")" ); } void pokaz(String tekst) { System.out.println("Metoda z parametrem"); System.out.print(tekst); pokaz(); } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr PrzeciąĪone PrzeciąĪone konstruktory metody Wywołanie metody przeciąĪonej 58 / 81 PrzeciąĪanie metod cd. public static void main(String[] args) { System.out.println("<=== Tworzenie obiektow ===>"); Para p1 = new Para(); Para p2 = new Para(3,7); System.out.println("\n<=== Metoda pokaz bez parametru ===>"); p2.pokaz(); System.out.println("\n<=== Metoda pokaz z parametrem ===>"); p2.pokaz("Para p2: "); } } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 59 / 81 Przedefiniowanie metody Przedefiniowanie metody klasy bazowej w klasie pochodnej nastĊpuje wtedy, gdy w klasie pochodnej zdefiniujemy metodĊ z taką samą sygnaturą (nazwa i lista parametrów) i typem wyniku jak sygnatura i typ wyniku nieprywatnej i niestatycznej metody klasy bazowej. Wówczas metoda klasy bazowej zostaje ukryta. Przykład: class Para { int a, b; Para(int x, int y) { System.out.println(" Konstruktor z parametrami"); a = x; b = y; } void pokaz() { System.out.println("Metoda bez parametru z klasy Para"); System.out.println("Para("+ a +", "+ b +")" ); } } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 60 / 81 Przedefiniowanie metody cd. class Trojka extends Para { int c; Trojka(int x, int y, int z) { super(x, y); c = z; } Wywołanie konstruktora klasy bazowej void pokaz() { System.out.println("Metoda bez parametru z klasy Trojka"); System.out.println("Trojka("+ a +", "+ b +", "+ c +")" ); } Przedefiniowanie metody z klasy bazowej void pokaz(String tekst) { System.out.println("Metoda z parametrem z klasy Trojka"); System.out.println(tekst); pokaz(); super.pokaz(); } public static void main(String[] args) { System.out.println("<=== Tworzenie obiektow ===>"); Trojka t1 = new Trojka(1, 2, 3); PrzeciąĪenie metody Wywołanie metody przedefiniowanej Wywołanie metody z klasy bazowej System.out.println("\n<=== Metoda pokaz bez parametru ===>"); t1.pokaz(); System.out.println("\n<=== Metoda pokaz z parametrem ===>"); t1.pokaz("Trojka t1: "); } } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 61 / 81 Przedefiniowanie metody cd. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 62 / 81 Pokrycie metody statycznej Pokrycie metody statycznej klasy bazowej w klasie pochodnej nastĊpuje wtedy, gdy w klasie pochodnej zdefiniujemy statyczną metodĊ z taką samą sygnaturą (nazwa i lista parametrów) i typem wyniku jak sygnatura i typ wyniku nieprywatnej i statycznej metody klasy bazowej. Wówczas metoda klasy bazowej zostaje ukryta. MoĪna siĊ do niej odwołaü z innej metody poprzedzając wywołanie metody nazwą klasy bazowej i operatorem „.” . Uwaga: W podobny sposób moĪna pokrywaü pola klasy bazowej. NaleĪy w klasie pochodnej zdefiniowaü pole o tej samej nazwie (moĪe byü innego typu). JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 63 / 81 Hierarchia dziedziczenia w Javie JeĞli przy definicji klasy nie uĪywamy słowa extends (tzn. nie Īądamy jawnie dziedziczenia) to nasza klasa domyĞlnie dziedziczy klasĊ Object. W Javie kaĪda klasa moĪe bezpoĞrednio odziedziczyü tylko jedną klasĊ. Ale poĞrednio moĪe mieü dowolnie wiele nadklas. W Javie wszystkie klasy pochodzą poĞrednio od klasy Object class A { } class B extends A { } class C extends A { } class D extends B { } class E extends E { } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 64 / 81 Konwersje referencyjne MoĪna zauwaĪyü, Īe obiekt klasy pochodnej posiada wszystkie atrybuty i metody klasy bazowej, a wiĊc „zawiera w sobie” obiekt klasy bazowej (nadklasy). Dlatego odniesienie do takiego obiektu moĪna zapamiĊtaü w zmiennej referencyjnej klasy bazowej. Obiekty klasy Ksiazka i klasy Czasopismo mają właĞciwoĞci obiektów klasy Publikacja (tzn. posiadają wszystkie atrybuty i metody klasy Publikacja). Referencje do obiektów klas Ksiazka i Czasopismo moĪna wiĊc przypisywaü do zmiennych referencyjnych klasy Publikacja. JĊzyka Java cz. 1 65 / 81 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr Konwersje referencyjne cd. Przykładowe instrukcje tworzące nowe obiekty klas Ksiazka i Czasopismo: Publikacja publ_1 = new Ksiazka(”Bolesław Prus”,”Lalka”, 22.50 ); Publikacja publ_2 = new Czasopismo(”Przektój”, 12, 3.90 ); publ_1 publ_2 JĊzyka Java cz. 1 Ksiazka tytul cena 22.50 autor Publikacja(...) podajTytul() podajCena() Ksiazka(...) podajAutor() String String ”Lalka” ”Bolesław Prus” Czasopismo tytul cena 3.90 numer 12 Publikacja(...) podajTytul() podajCena() Czasopismo(...) podajNumer() Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr String ”Przekrój” 66 / 81 Metody wirtualne JeĞli w podklasie (klasie pochodnej) zostanie przedefiniowana jakaĞ metoda, zdefiniowana pierwotnie w nadklasie (klasie bazowej) to przy wywołaniu tej metody zostanie uruchomiona metoda tej klasy, do której faktycznie naleĪy obiekt, a nie tej klasy która jest typem zmiennej referencyjnej zawierającej odniesienie do obiektu. Oznacza to, Īe wiązanie odwołaĔ do metod z kodem programu nastĊpuje nie w czasie kompilacji programu, lecz fazie wykonania programu tuĪ przed kaĪdorazowym wykonaniem instrukcji wywołującej przedefiniowaną metodĊ. Metody wirtualne to takie metody, dla których wiązanie odwołaĔ z kodem programu nastĊpuje w fazie wykonania programu JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 67 / 81 Metody wirtualne cd. Metody wirtualne to takie metody, dla których wiązanie odwołaĔ z kodem programu nastĊpuje w fazie wykonania programu W Javie wszystkie metody są wirtualne za wyjątkiem: ¾metod statycznych (bo nie dotyczą obiektów, a klasy) ¾metod deklarowanych ze specyfikatorem final, który oznacza, Īe metoda jest ostateczne i nie moĪe byü przedefiniowana, ¾metod prywatnych (bo metody prywatne nie mogą zostaü przedefiniowane). Odwołania do metod wirtualnych są polimorficzne, gdyĪ efekt kaĪdorazowego odwołania moĪe przybieraü róĪne kształty, w zaleĪnoĞci od tego jaki jest faktyczny typ obiektu, na rzecz którego wywołano metodĊ wirtualną. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 68 / 81 Metody wirtualne - przykład. class Zwierz { String nazwa = "nieznany"; Zwierz(){ } Zwierz(String n){ nazwa = n; } String podajGatunek() { return "Jakis zwierz"; } String podajNazwe() { return nazwa; } String podajGlos() { return "?"; } Metody podajGatunek(), podajNazwe(), podajGlos() są wirtualne. void mowa() { System.out.println(podajGatunek() + " " + podajNazwe() + " mowi " + podajGlos() ); } } class Pies extends Zwierz { Pies(){ } Pies(String n){ super(n); } String podajGatunek() { return "Pies"; } String podajGlos() { return "HAU HAU!"; } } Działanie metod wirtualnych wywołanych w metodzie mowa() bĊdzie zaleĪeü od klasy obiektu, na rzecz którego zostanie wywołana metoda mowa(). class Kot extends Zwierz { Kot() { } Kot(String n){ super(n); } String podajGatunek() { return "Kot"; } String podajGlos() { return "Miauuu..."; } } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 69 / 81 Metody wirtualne – przykład cd. class ZOO { static void dialogZwierzat(Zwierz z1, Zwierz z2) { z1.mowa(); z2.mowa(); System.out.println("----------------------------"); } public static void main(String []args) { Zwierz z1 = new Zwierz(), z2 = new Zwierz("Inny zwierz"); Pies pies = new Pies(), szarik = new Pies("Szarik"), reksio = new Pies("Reksio"); Kot filemon = new Kot("Filemon"); dialogZwierzat(z1, z2); dialogZwierzat(szarik, reksio); dialogZwierzat(pies, filemon); dialogZwierzat(szarik, filemon); } } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 70 / 81 Metody i klasy abstrakcyjne Metoda abstrakcyjna to metoda, która nie ma implementacji (ciała) i jest zadeklarowana ze specyfikatorem abstract. Taka metoda moĪe byü deklarowana tylko w klasie abstrakcyjnej ! abstract int obliczCos(); nie ma ciała – tylko Ğrednik Klasą abstrakcyjną to klasa, opatrzona specyfikatorem abstract. Taka klasa moĪe (ale nie musi) zawieraü metody abstrakcyjne. metoda abstrakcyjna abstract class JakasKlasa { abstract int obliczCos(); void wypiszCos(){ System.out.printn(”cos”); } } Nie moĪna tworzyü obiektów klasy abstrakcyjnej !!! JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 71 / 81 Metody i klasy abstrakcyjne cd. Klasa abstrakcyjna moĪe byü dziedziczona przez nowe klasy. Klasa pochodna MUSI przedefiniowaü (a właĞciwie zdefiniowaü) wszystkie metody abstrakcyjne, które odziedziczyła z abstrakcyjnej klasy bazowej. W przeciwnym wypadku klasa pochodna nadal pozostanie klasą abstrakcyjną i nie bĊdzie moĪna tworzyü jej obiektów. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 72 / 81 Interfejsy Interfejs w Javie to deklarowany za pomocą słowa kluczowego interface nazwany zbiór deklaracji zawierający: ¾ publiczne abstrakcyjne metody (bez implementacji), ¾ publiczne statyczne zmienne finalne (stałe) o ustalonych typach i wartoĞciach. Implementacja interfejsu w klasie polega na zdefiniowaniu w tej klasie wszystkich metod zadeklarowanych w implementowanym interfejsie. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 73 / 81 Interfejsy cd. Ogólna postaü definicji interfejsu w jĊzyku Java: public interface NazwaInterfejsu { typ nazwaZmiennej = wartosc; ... typ nazwaMetody(lista_parametrów); ... } Uwagi: ¾ modyfikator dostĊpu public przed słowem interface moĪe nie wystĊpowaü - wówczas interfejs jest dostĊpny tylko w bieĪącym pakiecie, ¾ zmienne są zawsze typu static final i mają przypisaną wartoĞü stałą, ¾ metody są zawsze abstrakcyjne (bez implementacji). JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 74 / 81 Implementacja interfejsu Ogólna postaü definicji klasy implementującej interfejs w jĊzyku Java: public class NazwaKlasy extends KlasaBazowa implements NazwaInterfejsu_1, ..., NazwaInterjejsu_n { ... } Uwagi: ¾ modyfikator dostĊpu public przed słowem class moĪe nie wystĊpowaü wówczas klasa jest dostĊpna tylko w bieĪącym pakiecie, ¾ klasa moĪe ale nie musi dziedziczyü inną klasĊ (słowa extends KlasaBazowa mogą nie wystĊpowaü) ¾ klasa moĪe implementowaü wiele interfejsów, ¾ klasa musi definiowaü WSZYSTKIE metody implementowanych interfejsów albo pozostaü klasą abstrakcyjną. ¾ klasa moĪe zawieraü własne (nie bĊdące czĊĞcią interfejsu) atrybuty i metody. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 75 / 81 Implementacja interfejsu – przykład Przykład zawiera implementacjĊ klas reprezentujących róĪne gatunki zwierząt. CzeĞü zwierząt potrafi pływaü, Niektóre potrafią wydawaü odgłosy. JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 76 / 81 Implementacja interfejsu – przykład /** * Interfejs definiujący metody * dla obiektów pływających w wodzie */ interface Plywa { float podajGlebokosc(); } /** * Interfejs definiujący metody * dla obiektów wydających glosy */ interface WydajeGlos { String podajGlos(); } /** * Klasa abstrakcyjna reprezentująca zwierzĊta */ abstract class Zwierz { String nazwa; Zwierz(String nazwa){ this.nazwa = nazwa;} public String podajNazwe(){return nazwa; } public abstract String podajGatunek(); public abstract void info(); } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 77 / 81 Implementacja interfejsu – przykład cd. Klasa Ryba jest klasą pochodną Zwierz, która implementuje interfejs Plywa, natomiast klasa Kot implementuje interfejs WydajeGlos class Ryba extends Zwierz implements Plywa { float glebokosc; Ryba(String nazwa, float glebokosc) { super(nazwa); this.glebokosc = glebokosc; } public String podajGatunek() { return "Ryba"; } public float podajGlebokosc(){ return glebokosc;} public void info() { System.out.println(podajNazwe() + " pływa na głĊbokoĞci " + podajGlebokosc() ); } } class Kot extends Zwierz implements WydajeGlos { Kot(String nazwa){ super(nazwa); } public String podajGatunek() { return "Kot"; } public String podajGlos() { return "Miauuu"; } public void info() { System.out.println(podajNazwe() + " mówi " + podajGlos()); } } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 78 / 81 Implementacja interfejsu – przykład cd. Klasa Kaczka jest klasą pochodną Zwierz, która implementuje zarówno interfejs Plywa jak i interfejs WydajeGlos class Kaczka extends Zwierz implements Plywa, WydajeGlos { Kaczka(String nazwa){ super(nazwa); } public String podajGatunek() { return "Kaczka"; } public float podajGlebokosc(){ return 0.0F; } public String podajGlos() { return "Kwa Kwa";} public void info() { System.out.println(podajNazwe() + " pływa po powierzchni i mówi ” + podajGlos() ); } } JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 79 / 81 Interfejs i zmienne referencyjne Interfejsy, podobnie jak klasy wyznaczają typy zmiennych referencyjnych. Przykład: Deklaracja zmiennej, której typem jest interfejs WydajeGlos wg1, wg2; WartoĞcią takiej zmiennej moĪe byü odwołanie do obiektu dowolnej klasy, która implementuje ten interfejs. wg1 = new Kaczka(”Dziwaczka”); wg2 = new Kot(”Bonifacy”); Przy wykonywaniu powyĪszych przypisaĔ nastĊpuje referencyjna konwersja rozszerzająca referencji wskazującej na nowy obiekt do typu interfejsu (implementowany interfejs jest traktowany podobnie jak klasa bazowa). JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 80 / 81 Interfejs i zmienne referencyjne cd. Przez zmienną której typem jest interfejs moĪna wywołaü dowolną metodĊ zadeklarowaną w tym interfejsie: System.out.println( wg1.podajGlos() ); // wypisze ”Kwa Kwa” System.out.println( wg2.podajGlos() ); // wypisze ”Miauuu” Wywoła siĊ poprawna wersja metody, odpowiednio dla faktycznego obiektu wskazywanego przez zmienną. Wywołanie innej metody, która nie została zdefiniowana w interfejsie, jest moĪliwe wyłącznie po uĪyciu jawnej konwersji zawĊĪającej: ((Zwierz)wg1).info(); // wypisze ”Dziwaczka pływa po powierzchni i mówi Kwa Kwa” ((Zwierz)wg2).info(); // wypisze ”Bonifacy mówi Miauuu” JĊzyka Java cz. 1 Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr 81 / 81 Nazwa pliku: 06_Java_Streszczenie.doc Katalog: C:\Documents and Settings\pawel\Moje dokumenty\www\idun\dydaktyka\zaoczne_Pr og_wsp\Wyklad_java Szablon: C:\Documents and Settings\pawel\Dane aplikacji\Microsoft\Szablony\Normal.dot Tytuł: 1 Temat: Autor: pawel Słowa kluczowe: Komentarze: Data utworzenia: 2006-08-06 19:03:00 Numer edycji: 148 Ostatnio zapisany: 2008-05-16 21:44:00 Ostatnio zapisany przez: pawel Całkowity czas edycji: 5 756 minut Ostatnio drukowany: 2008-05-16 23:32:00 Po ostatnim całkowitym wydruku Liczba stron: 81 Liczba wyrazów: 6 309 (około) Liczba znaków: 37 854 (około)