Technologie i usługi internetowe cz. 2 Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 15 luty 2014 r. 1
Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to paradygmat programowania, w którym programy definiuje się za pomocą obiektów elementów łączących stan (czyli dane, nazywane najczęściej polami) i zachowanie (czyli procedury, w tym wypadku nazywane: metodami). Obiektowy program komputerowy wyrażony jest jako zbiór takich obiektów, komunikujących się pomiędzy sobą w celu wykonywania zadań. Podejście to różni się od tradycyjnego programowania proceduralnego, gdzie dane i procedury nie są ze sobą bezpośrednio związane. Programowanie obiektowe ma ułatwić pisanie, konserwację i wielokrotne użycie programów lub ich fragmentów. 2
Czym jest obiekt w programowaniu obiektowym? Programowanie obiektowe jak sama nazwa wskazuje posługuje się obiektami. Obiekty charakteryzują się: atrybutami (cechami, stanami, pola), operacjami, które można na nich wykonać (usługami, poleceniami, metodami). Na przykład jeśli obiektem jest samochód to atrybutami mogą być: producent, cieżar, maksymalna prędkość jazdy. Natomiast, operacjami jakie można wykonywać na tym obiekcie mogą być: pobierz producenta, pobierz ciężar, ustaw prędkość maksymalną. 3
Czym jest klasa w programowaniu obiektowym? Informację o atrybutach danego obiektu oraz o operacjach które można na nim wykonać czerpiemy z definicji klasy odpowiadającej danemu obiektowi. Taką klasę samochodów nasz program musi albo skądś pobrać albo sam dostarczyć. Klasa - to zestaw atrybutów i operacji grupy podobnych obiektów, które są dla nich niezmienne. 4
Realizacja klasy Samochod w Javie public class Samochod { String producent; int ciezar; int maksymalnapredkoscjazdy; public String getproducent() { return producent; public void setproducent(string producent) { this.producent = producent; public int getciezar() { return ciezar; public void setciezar(int ciezar) { this.ciezar = ciezar; public int getmaksymalnapredkoscjazdy() { return maksymalnapredkoscjazdy; public void setmaksymalnapredkoscjazdy(int maksymalnapredkoscjazdy) { this.maksymalnapredkoscjazdy = maksymalnapredkoscjazdy; 5
Tworzenie obiektu, konstruktory i destruktory Konstruktor to specjalna metoda umożliwiająca tworzenie obiektów. Konstruktor domyślny: new Samochod(); lub Samochod sam = new Samochod(); Konstruktor ustawiający wartości pól: public Samochod(String producentn, int ciezarn, int maksymalnapredkoscjazdyn) { producent = producentn; ciezar = ciezarn; maksymalnapredkoscjazdy = maksymalnapredkoscjazdyn; Destruktor to specjalna metoda umożliwiająca niszczenie obiektów. W Javie nie ma destruktorów. Jest za to mechanizm Garbage Collector 6
Główne cechy programowania obiektowego Abstrakcja Enkapsulacja Dziedziczenie Polimorfizm 7
Abstrakcja Każdy obiekt w programie (definiowany za pomocą abstrakcyjnego typu jakim jest klasa) służy jako model abstrakcyjnego "wykonawcy", który może wykonywać pracę, opisywać i zmieniać swój stan oraz komunikować się z innymi obiektami w systemie bez ujawniania, w jaki sposób zaimplementowane są jego cechy. 8
Klasa Punkt2D class Punkt2D { int x,y; Punkt2D(int x, int y) { this.x = x; this.y = y; 9
Ćwiczenie 1 1. Dopisz metody, które będą pobierać współrzędne x i y punktu. 2. Dopisz metody, które ustawią współrzędne x i y punktu na określoną wartość. 3. Dopisz metodę liczbawspolrzednych(), która pobierze liczbę współrzędnych punktu. 4. Przedefiniuj metodę tostring() tak aby wypisywała reprezentację punktu. 10
Enkapsulacja (hermetyzacja) Enkapsulacja (hermetyzacja) to ukrywanie implementacji. Zapewnia, że obiekt nie może zmieniać stanu wewnętrznego innych obiektów w nieoczekiwany sposób. Tylko własne metody obiektu są uprawnione do zmiany jego stanu. Każdy typ obiektu prezentuje innym obiektom swój interfejs, który określa dopuszczalne metody współpracy. W Javie klasycznie mamy cztery modyfikatory dostępu: private - do danych można się dostać tylko z wnętrza danej klasy public dane są ogólnie dostępne protected do danych można się dostać z wnętrza danej klasy, klas pochodnych i z klas tego samego pakietu package do danych można się dostać w obrębie tego samego pakietu 11
Ćwiczenie 2 1. Przerób klasę Punkt2D zachowując koncepcję enkapsulacji pól i metod. 2. Utwórz w klasie Punkt2D pole statyczne liczbapunktow które będzie zliczać liczbę utworzonych punktów w programie. 3. Utwórz w klasie Punkt2D metodę odlegloscodzera(), która wyznaczy odległość punktu od zera. 12
Dziedziczenie Dziedziczeniem (z ang. inheritance) w programowaniu obiektowym nazywamy mechanizm współdzielenia funkcjonalności pomiędzy klasami. Klasa może dziedziczyć po innej klasie, co oznacza, że oprócz swoich własnych atrybutów oraz zachowań, uzyskuje także te pochodzące z klasy, z której dziedziczy. Klasa dziedzicząca jest nazywana klasą pochodną lub potomną (z ang. subclass), klasa, z której następuje dziedziczenie jest nazywana klasą bazową (z ang. superclass). 13
Klasa Punkt3D (klasa rozszerzająca Punkt2D) public class Punkt3D extends Punkt2D{ private int z; public Punkt3D(int x, int y, int z) { super(x,y); this.z=z; public int getz() { return z; public void setz(int z) { this.z = z; 14
Ćwiczenie 3 1. Przerób w klasie Punkt3D metodę liczbawspolrzednych() tak aby działała prawidłowo. 2. Przerób w klasie Punkt3D metodę tostring() aby prawidłowo zwracała reprezentację obiektu. 3. Przerób w klasie Punkt3D metodę odlegloscodzera(), która poprawnie wyznaczy odległość punktu od zera. 15
Polimorfizm Polimorfizm w programowaniu obiektowym to cecha dzięki której jedna metoda (o tej samej nazwie) może być stosowana do wykonania różnych zadań w zależności od tego na rzecz którego obiektu została wywołana. 16
Ćwiczenie 4 Tworzymy tablicę 10 elementową do przechowywania obiektów typu Punkt2D. Punkt2D[] tabpunktow = new Punkt2D[10]; W pętli dla i=1..10 losujemy liczbę p z przedziału [0,1]. Jeśli liczba p jest mniejsza od ½ to tworzymy obiekt typu Punkt2D(x,y), gdzie x pierwsza cyfra po przecinku liczby p, y druga cyfra po przecinku liczby p, jeśli z kolei liczba p jest większa równa od ½ to wówczas tworzymy obiekt typu Punkt3D(x,y,z), gdzie x pierwsza cyfra po przecinku liczby p, y druga cyfra po przecinku liczby p, z trzecia cyfra po przecinku liczby p. Wyświetl w pętli od 1..10 informację o liczbie współrzędnych każdego z utworzonych obiektów. Zauważ, że nie wiedząc czy na przykład pod tabpunktów[4] znajduje się obiekt typu Punkt2D czy Punkt3D program poprawnie wyświetla 2 lub 3 (to jest zaleta polimorfizmu właśnie.) 17
Zadanie domowe 3 Dopisz w klasie Punkt2D metodę public double odl(punkt a){ która obliczy odległość dwóch punktów: Punkt2D p1 = new Point2D(2,1); Punkt2D p2 = new Point2D(1,2); p1.odl(p2); Napisz teraz metodę boolean czytrojkat(p1,p2,p3) która sprawdzi, czy punkty p1, p2 i p3 są wierzchołkami trójkąta. 18
Dziękuję za uwagę 19