Podstawy programowania obiektowego Technologie internetowe Wykład 5
Program wykładu Podejście obiektowe kontra strukturalne do tworzenie programu Pojęcie klasy i obiektu Składowe klasy: pola i metody Tworzenie i usuwanie obiektów: konstruktory, garbage collector Referencje
Programowanie obiektowe szybsze projektowanie i tworzenie oprogramowania niekoniecznie szybsze programy programowanie wyższego poziomu (bliższe myśleniu człowieka a nie potrzebom komputera) wielokrotne wykorzystywanie kodu (reusability) obecnie praktycznie standard w językach programowania (Java, C++, C#, PHP, Rubby, Python,...)
Programowanie obiektowe organizacja kodu wg wykonawcy czynności (kod zgrupowany w klasach) metody, konstruktory pola obiekty klasy Programowanie strukturalne organizacja kodu wg tego, co się robi (kod zgrupowany w funkcjach) funkcje zmienne zmienne nowe złożone typy zmiennych (rekordy, struktury)
Obiekt jako serwer usług połóż liczbę: push(int):void usuń liczbę : pop():void STOS (LIFO/LIFO) odczytaj ostatnią liczbę: top():int czy jesteś pusty: empty():boolean
Program obiektowy jako zbiór komunikujący się obiektów zrób coś dla mnie zrób coś dla mnie zrób coś dla mnie zrób coś dla mnie zrób coś dla mnie zrób coś dla mnie zrób coś dla mnie
Wykorzystanie stosu import java.util.scanner;... Stos stos = new Stos(); Scanner sk= new Scanner(System.in); stos.push(sk.nextint()); stos.push(sk.nextint()); stos.push(sk.nextint()); while (! stos.empty()) { System.out.println(stos.top()); stos.pop();
Implementacja stosu class Stos { int[] tab = new int [100]; int wierzch=-1; boolean empty() { return (wierzch==-1); void push(int liczba) { tab[++wierzch]=liczba; void pop() { -- wierzch; int top() { return tab[wierzch]; metody usługi, które może wykonać stos pola potrzebne do realizacji usług
Implementacja stosu 2 class Element { Element nastepny; int liczba; s ostatni class Stos { nowy Element ostatni=null; boolean empty() { return (ostatni==null); 3 void push(int liczba) { Element nowy=new Element(); nowy.liczba=liczba; nowy.nastepny=ostatni; ostatni=nowy; null 47 4 void pop() { ostatni = ostatni.nastepny; int top() { return ostatni.liczba;
Konstruktory inicjalizują obiekt jak metoda, ale nie metoda: nazwa jak nazwa klasy brak wyniku może być więcej niż 1 (przciążanie konstruktorów) zawsze jest co najmniej 1 jeśli nie ma, kompilator dodaje konstruktor domyślny: class Stos { => class Stos { Stos() {
Konstruktory class Stos { int[] tab; int wierzch; Stos(int rozmiar) { tab=new int[rozmiar]; wierzch=-1; Stos() { tab=new int[100]; <==> wierzch=-1; Stos() { this(100);... Stos s10=new Stos(10), s100=new Stos();
Pseudo zmienna 'this' class Punkt { int x, y; Punkt(int x, int y) { x=x;?? y=y;??
class Punkt { int x, y; Pseudo zmienna 'this' Punkt(int x, int y) { x=x; y=y; this.x=x; this.y=y; int getx() { return x; lepiej!!! void setx(int x) { => this.x=x; void setx(int xx){ x=xx;
Pseudo zmienna 'this' Punkt class Punkt { int x, y; p x: 0 1 y: 0 obiekt void setx(int x) { => this.x=x; setx x: 1 this rekord aktywacji metody... Punkt p = new Punkt(0,0); p.setx(1); Punkt q=new Punkt(100,100); q.setx(3); setx x: 3 this q Punkt x: 100 3 y: 100 rekord aktywacji metody obiekt
Usuwanie obiektów częste źródło błędów w programowaniu: zapominanie o usuwaniu zmiennych/obiektów (ogólnie o zwalnianiu pamięci) w Javie nie można usunąć obiektu!!! robi to za nas proces Garbage Collector kiedy usuwa obiekty? kiedy nie są już potrzebne!!!
Obiekty niepotrzebne obiekt jest niepotrzebny, kiedy nie można z niego skorzystać: p Punkt p=new Punkt (0,0); p=new Punkt(1,1); x: 0 y: 0 x: 1 y: 1 pierwszy obiekt jest w pamięci, setx ale nie można się do niego odwołać jest śmieciem (garbage) zajmuje pamięć zajmie się nim GC
Garbage Collector wkracza do akcji automatycznie kiedy brakuje pamięci ale nowoczesne komputery mają dużo pamięci czasami nie ma potrzeby usuwania obiektów wszystkie się zmieszczą usuwanie pojedynczych obiektów zwalnia program można go poprosić o oczyszczenie pamięci kiedy chcemy: System.gc(); w Javie nie ma destruktorów
Funkcja 'finalize' public class Punkt {... public void finalize() { System.out.println( Ktoś usuwa mnie z pamięci ); public static void main(string[[ args) { Punkt p=new Punkt(); System.gc(); System.out.println( Stworzyłem punkt i uruchomiłem GC ); p=null; //obiekt punktu staje się śmieciem System.out.println( Uruchamiam jeszcze raz GC ); System.gc(); System.out.println( Kończę program ); > Stworzyłem punkt i uruchomiłem GC > Uruchamiam jeszcze raz GC > Ktoś usuwa mnie z pamięci > Kończę program
Referencje referencje jak wskaźniki w C/C++ tu nie powstaje żaden obiekt!!! Punkt p, q, r; p=q; referencje są zmiennymi automatycznymi tak jak zmienne typów prostych: int, float, char,... (znikają automatycznie, kiedy wychodzimy z zakresu np. funkcji): void f() { Punkt p=new Punkt(); //tu znika 'p', ale obiekt // pozostaje w pamięci (jako śmieć) obiekty są zmiennymi dynamicznymi (jeśli chodzi o tworzenie) ale nie trzeba ich dynamicznie usuwać (bo jest GC) np. w C++ obiekt-śmieć nie znika sam, trzeba go usunąć za pomocą 'delete' zanim stanie się śmieciem (bo w C++ nie ma GC): delete p; p x y