Klasy i obiekty. Programowanie zorientowane obiektowo. Case study: Filmoteka Case study: Klasa Akademik
Dlaczego obiekty Załóżmy, że mamy napisać program o następującej specyfikacji: 1. Program wyświetla kwadrat, okrąg i trójkąt. 2. Gdy użytkownik kliknie na jakiś kształt tenże zaczyna świecić na niebiesko. 3. Jednocześnie odgrywana jest muzyczka w.mp3, specyficzna do każdego z kształtów.
Tak to ma wyglądać
Obiektowo vs. proceduralnie Proceduralnie Obiektowo Kwadrat Trójkąt /* odegraj dźwięk*/ Okrąg odtwórzdźwięk() { /* odegraj dźwięk*/ /* odegraj dźwięk*/
Ale życie płata figle Dodajemy nowy kształt: Dodamy nowy kształt, ale tenże będzie odgrywał muzyczkę.wav
Jak się kod zmieni Proceduralnie Zmieniamy przetestowany już kod i być może coś się zepsuje Obiektowo Kwadrat /* odegraj dźwięk mp3*/ Okrąg /* odegraj dźwięk mp3*/ Trójkąt /* odegraj dźwięk mp3*/ Dziwnokształtny /* odegraj plik.wav*/
Ale życie płata figle po raz drugi Kształt ma mieć inny kolor po kliknięciu: A do tego kolor ten ma być zmienny, podawany w parametrze i do tego gradientowy
No to czas na kolejną zmianę kodu Proceduralnie Zmieniamy przetestowany kod Kolejne if-y Obiektowo Kwadrat /* odegraj dźwięk mp3*/ Okrąg /* odegraj dźwięk mp3*/ Trójkąt /* odegraj dźwięk mp3*/ Dziwnokształtny kolor1; kolor2; z gradientem /* odegraj plik.wav*/
Hola, a gdzie przewaga OO? Kwadrat Okrąg Trójkąt Dziwnokształtny /* odegraj dźwięk mp3*/ /* odegraj dźwięk mp3*/ /* odegraj dźwięk mp3*/ kolor1; kolor2; z gradientem /* odegraj plik.wav*/
A tutaj: dziedziczenie Kwadrat Okrąg Trójkąt Dziwnokształtny Kształt /* odegraj dźwięk*/
A tutaj: dziedziczenie z przysłanianiem Kwadrat Okrąg Trójkąt Dziwnokształtny kolor1; kolor2; // tu będzie kod do zmiany koloru z gradientem /* odegraj plik.wav*/ Kształt /* odegraj dźwięk*/
Ogólna zasada pracy z obiektami i klasami Nazwa klasy To co obiekt wie To co obiekt potrafi Klasa będzie swoistym projektem obiektów tworzonych na jej podstawie. To co obiekt wie = atrybuty To co obiekt potrafi = metody
Pies To co obiekt wie Telewizor To co obiekt wie To co obiekt potrafi To co obiekt potrafi
Klasa vs. obiekt
Interesujący kurs programowania?
Pierwsza świadoma klasa
Druga świadoma klasa
Kilka ważnych rzeczy Programowanie zorientowane obiektowo pozwala na dodawanie funkcjonalności bez zmiany uprzednio przetestowanego kodu. Wszystko w Javie jest obiektem (znajduje się wewnątrz klasy) Klasa opisuje sposób na stworzenie obiektu danego typu. Taki schemat. Obiekt potrafi robić różne rzeczy. Niekoniecznie interesuje nas w jaki sposób to robi. Obiekt wie o niektórych rzeczach i robi specyficzne rzeczy Rzeczy które obiekt wie o sobie nazywane atrybutami. Reprezentują stan obiektu. Rzeczy które obiekt robi nazywane są metodami. Reprezentują zachowanie obiektu. Gdy tworzysz klasę, zwykle powinieneś też stworzyć oddzielną klasę do testowania w której stworzysz obiekty poprzedniej klasy. Klasa może dziedziczyć atrybuty i metody z superklas (bardziej ogólnych klas) Programy w Javie to po prostu gadanie obiektów do siebie
Ćwiczenia Napisz klasę realizującą rozwiązywanie równania kwadratowego. Klasa powinna posiadać pola prywatne A, B, C, reprezentujące współczynniki równania, wraz z odpowiednimi akcesorami i modyfikatorami. Dodatkowo należy stworzyć funkcję składową delta(), obliczającą wyróżnik trójmianu, oraz trzy funkcje obliczające miejsca zerowe. Klasa powinna być wyposażona w konstruktor domyślny oraz trójparametrowy konstruktor ogólny. Należy zastanowić się nad przypadkiem, gdy równanie staje się liniowym tzn. A = 0 i zaproponować rozwiązanie tego problemu.
Ciąg dalszy Obiekt stworzonej klasy może być wykorzystany następująco: RownanieKwadratowe r = new RownanieKwadratowe(); Scanner s = new Scanner(System.in) double num; System.out.println( Podaj A: ) S.nextDouble(num) r.ustawa( num ); //to samo dla B i C if( r.delta() > 0 ) S.O.P( "Pierwiastki rownania x1=" + r.obliczx1() + " x2=" + r.obliczx2()); else if(r.delta() = 0 ) S.O.P("Pierwiastek podwójny x12=" + r.obliczx12()); else S.O.P.("Brak pierwiastkow rzeczywistych ); Obiekty mogą być inicjowane następująco: RownanieKwadratowe r1 = new RownanieKwadratowe(); // Konstruktor inicjuje A=B=C=0; RownanieKwadratowe r2 = new RownanieKwadratowe(3,2,1); // Konstruktor inicjuje A=3,B=2,C=1;
Ćwiczenia Załóżmy, że gromadzimy wodę mineralną. Są trzy rodzaje butelek o pojemności 2l (duże), średnie o pojemności 1l oraz małe o pojemności 0.5 litra. Stworzyć klasę MyWater z metodami: void addlarge(int) dodaje do zapasu wody podaną jako argument liczbę dużych butelek. void addmedium(int) dodaje do zapasu wody podaną jako argument liczbę średnich butelek. void addsmall(int) dodaje do zapasu wody podaną jako argument liczbę małych butelek. Dodatkowo należy zaimplementować metody umożliwiające uzyskanie informacji o tym ile jest każdego rodzaju butelek, oraz jaka jest łączna pojemność zgromadzonej wody. Dostarczyć metod pozwalających uzyskiwać informacje o tych pojemnościach oraz je zmieniać. Klasę przetestować wyprowadzając dane na ekran: Mam teraz 6.5 litrów wody. Dużych butelek: 2 Małych butelek: 3 Średnich butelek: 1
Zadanie domowe Poczytaj o konstruktorach w Javie (np. http://rpodhajny.wordpress.com/2009/03/17/javakonstruktor/, ale nie tylko tutaj) Napisz własną klasę do obsługi liczb zespolonych. Każda taka liczba ma część rzeczywistą i urojoną Na liczbach można wykonywać operacje dodawania, odejmowania, mnożenia i dzielenia zgodnie z regułami matematyki Liczby należy ustawiać konstruktorem parametrowym Liczby można przypisywać między sobą za pomocą odpowiedniej metody Klasa powinna mieć zaimplementowane metody takie jak: getvalues() zwraca wartość części rzeczywistej i urojonej, getreal(), getimg() odpowiednio rzeczywistą i urojoną, itp.
Zadanie domowe 2 Napisz klasę Karta() reprezentującą karty do gry Karty mają swój kolor oraz figurę. Karta wie także czy jest słabsza, czy silniejsza od innych. Napisz przykładową grę w wojnę: Stworzysz talię 24 kart (od dziewiątek do asów w różnych kolorach; wykorzystaj do tego pętle, a nie rób tego ręcznie) Stworzysz tablicę tych kart. Komputer i Ty losujecie karty, wygrywa większa.
Zadanie domowe 2 // w tablicy talia mamy karty while(ktosniewygral) { //wylosuj bez zwracania kartę dla usera1 i usera2: Karta kartauser1 = talia[random]; Karta kartauser2 = talia[random]; if(kartauser1.bije(kartauser2)) user1score++ else if(kartauser2.bije(kartauser1)) user2score++
Zadanie domowe 3 Napisz klasę Wielomian() Klasa powinna być konstruowana za pomocą konstruktora parametrowego Wielomian(double[] wspolczynniki), np. Wielomian( {1,0,0,3,-5) reprezentuje wielomian: x 4 + 3x 5 Dopisz metody: void dodaj(wielomian inny) void przemnóż(double wartosc) int jakistopien() double[] pierwszapochodna() double wartosc(double x)
Zadanie domowe 4 Napisz klasę pomagającą w obliczeniach statystycznych: Statystyka() Metody: void dodajliczbe(double liczba) //dodaje liczbe do wewnętrznej tablicy liczb int ileliczb() double sumaliczb() double srednialiczb() double zwróćmin()
Zadanie domowe 5 Przejdź przez bardzo fajny tutorial na stronie Oracle: http://docs.oracle.com/javase/tutorial/java/javaoo/ind ex.html