Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.
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
Główne cechy programowania obiektowego Abstrakcja Enkapsulacja Dziedziczenie Polimorfizm 3
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. 4
Klasa Punkt2D class Punkt2D { int x,y; } Punkt2D(int x, int y) { this.x = x; this.y = y; } 5
Ć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. 6
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 7
Ć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. 8
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). 9
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; } 10
Ć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. 11
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. 12
Ć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.) 13
Praca domowa 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. 14