Podstawy Języka Java
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.
Czym jest obiekt w programowaniu obiektowym Obiekt to pojemnik do przechowywania zmiennych i funkcji tematycznie ze sobą powiązanych. Obiekty w programowaniu obiektowym charakteryzują się: atrybutami (cechy, stany, pola), operacjami, które można na nich wykonać (usługi, polecenia, metody). Na przykład jeśli obiektem jest samochód, to atrybutami mogą być: długość, szerokość, prędkość jazdy. Natomiast, operacjami jakie można wykonywać na tym obiekcie, mogą być: ustaw długość, odczytaj szerokość, zwiększ prędkość.
Czym jest klasa w programowaniu obiektowym Klasa jest szablonem, ż którego tworzy się obiekty. Jeśli klasy są foremkami do robienia ciastek, to obiekty są samymi ciastkami. Konstruując obiekt tworzymy egzemplarz (instancję) klasy. Wszystko co piszemy w Javie znajduje się w jakiejś klasie. W standardowej bibliotece znajduje się kilka tysięcy klas. Jednak konieczne jest tworzenie własnych klas do opisu obiektów rozwiązujących problemy związane z konkretnym programem.
c l a s s Nazwa { // d e k l a r a c j e p ó l typ p o l e 1 ;... typ polen ; // d e k l a r a c j e metod typ metoda1 ( l i s t a parametrów ) { // t r e ś ć metody... typ metodam ( l i s t a parametrów ) { // t r e ś ć metody
p u b l i c c l a s s Samochod { i n t d l u g o s c ; i n t s z e r o k o s c ; i n t p r e d k o s c J a z d y ; p u b l i c i n t g e t D l u g o s c ( ) { r e t u r n d l u g o s c ; p u b l i c void s e t D l u g o s c ( i n t d l u g o s c ) { t h i s. d l u g o s c = d l u g o s c ; p u b l i c i n t g e t S z e r o k o s c ( ) { r e t u r n s z e r o k o s c ; p u b l i c void s e t S z e r o k o s c ( i n t s z e r o k o s c ) { t h i s. s z e r o k o s c = s z e r o k o s c ; p u b l i c i n t g e t P r e d k o s c J a z d y ( ) { r e t u r n p r e d k o s c J a z d y ; p u b l i c void s e t P r e d k o s c J a z d y ( i n t p r e d k o s c J a z d y ) { t h i s. p r e d k o s c J a z d y = p r e d k o s c J a z d y ;
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: public Samochod(int dlugoscn, int szerokoscn, int predkoscjazdyn) { dlugosc = dlugoscn; szerokosc = szerokoscn; predkoscjazdy = predkoscjazdyn; Destruktor to specjalna metoda umożliwiająca niszczenie obiektów. W Javie nie ma destruktorów. Jest za to mechanizm Garbage Collector.
Zadania Zadanie 1. Stwórz nowy projekt w NetBeans i klasę Samochod z polami i metodami opisanymi powyżej. Stwórz dwa obiekty tej klasy sam1 i sam2 i ustaw im początkowe wartości na dowolne liczby nieujemne (aktualna prędkość ma być liczbą z przedziału [0,100]).
Główne cechy programowania obiektowego Abstrakcja Enkapsulacja Dziedziczenie Polimorfizm
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.
c l a s s Punkt2D { i n t x, y ; Punkt2D ( i n t x, i n t y ) { t h i s. x = x ; t h i s. y = y ;
Zadanie Zadanie 2. Dopisz metody, które będą pobierać współrzędne x i y punktu. Dopisz metody, które ustawią współrzędne x i y punktu na określoną wartość. Dopisz metodę liczbawspolrzednych(), która pobierze liczbę współrzędnych punktu. Przedefiniuj metodę tostring() tak aby wypisywała reprezentację punktu.
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
Zadanie Zadanie 3. Przerób klasę Punkt2D zachowując koncepcję enkapsulacji pól i metod. Utwórz w klasie Punkt2D pole statyczne liczbapunktow, które będzie zliczać liczbę utworzonych punktów w programie. Utwórz w klasie Punkt2D metodę odlegloscodzera(), która wyznaczy odległość punktu od zera.
Zadania Zadanie 4. Napisz zgodnie z zasadami programowania obiektowego program, który oblicza pole prostokąta. Klasa powinna zawierać trzy metody: czytajdane() - metoda umożliwia wprowadzenie do programu długości boków a i b z klawiatury. W programie należy przyjąć, że a, b oraz zmienna pole są typu double. przetworzdane() - metoda oblicza pole prostokąta według wzoru: pole = a b. wyswietlwynik() - metoda wyświetla długości boków a i b oraz wartość zmiennej pole w określonym formacie. Dla zmiennych a, b oraz pole należy przyjąć format wyświetlania ich na ekranie z dwoma miejscami po przecinku.
Pakiety Program w języku Java to zbiór klas. Klasy zebrane są w pakiety aby pogrupować je według znaczenia. Kluczowe słowo do tworzenia pakietu, to package. package zaj5; public class Proba { public static void main(string[] args) { System.out.println("Hello World"); Nazwy pakietów zwyczajowo pisze się małymi literami. Kolejne poziomy zagnieżdżenia pakietów oddziela się od siebie kropkami. Przykłady pakietów: java.lang, java.util, java.io, java.applet, java.awt
Import klas Sama nazwa klasy nie musi identyfikować jej w sposób jednoznaczny. Należy określić pakiet w obrębie którego została ona zdefiniowana. Aby skorzystać z klasy zamkniętej w obrębie jakiegoś pakietu należy ją zaimportować przy pomocy polecenia import. package zaj52; public class Proba2 { public static void pisz(string s) { System.out.println(s); package zaj51; import zaj52.proba2; public class Proba1 { public static void main(string[] args) { Proba2.pisz( Ala"); System.out.println("Hello World");
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).
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;
Zadanie Zadanie 5. 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.
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.
Zadanie Zadanie 6. 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 1/2, 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 1/2, 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.)
Zadanie Zadanie 7. 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.