Conceptele programarii orientate obiect

    1. Caracterizarea obiectului
    2. Starea obiectului
    3. Identificarea obiectului
    4. Clasa, instanta
    5. Starile unui obiect
    6. Proprietatea de incapsulare;Ascunderea informatiei
    7. Exemplu: Stiva deintregi

1.  Caracterizarea obiectului

Obiectul  stocheaza informatie si executa anumite sarcini la cerere. Un obiect este format din date (atribute) si metode (operatii).
Obiect=Date+Cod

Metodele de fapt sunt rutine care lucreaza cu datele obiectului. Siacum sa consideram obiectul Om. Un om poate fi caracterizat de nume, dedata nasterii, de inaltime, adresa. Sunt si alte caracteristici ale omului,dar pentru a rezolva problema noastra e de ajuns sa le consideram doarpe acestea. Acum discutam cateva metode prin care se manifesta obiectul nostru. De exemplu oamenii se muta din cand in cand. Odata cu mutarea seva schimba si adresa omului. Omul poate sa creasca in inaltime pana lao anumita varsta. Deci obiectul om poate fi caracterizat prin: Pana acum am descris o abstractizare a omului, care va fi un tip nou. Acum sa consideram un exemplu concret, adica un obiect de tip om.

Un alt exemplu. Vom incerca sa caracterizam ferestrele de pe ecran. Unobiect de tip fereastra poate fi caracterizat prin urmatoarele date simetode:
Date:
x0,y0: coordonatele coltului stanga-sus, intregi
latime, inaltime:  intregi
Metode:
afisare()
ascundere()
stergere()

2. Starea obiectului

Este formata din valorile actuale ale datelor. Dupa apelul anumitor metode (ale celor care modifica campurile de date) starea obiectului se poatemodifica.  Doua obiecte se afla in aceeasi stare daca valorile campurilorde date coincid.
Exemplu:
Om Om("Ioan",32) si

3. Identificarea obiectului

Doua obiecte pot fi in aceeasi stare, dar ele nu pot fi identice, deoarece adresa lor in memorie difera. Obiectele sunt identificate prin referinte. Doua referinte pot referi acelasi obiect.
Exemple:
     String s1 ="Un sir de caractere";
    String s2 = s1;
 
    // Doua referinte la un singur obiect
    Om o1 = new Om("Pop Ioan",1960,182,"Tg-Mures");
    Om o2 = o1;
 

Obiectul "Un sir de caractere" exista intr-un singur exemplar si avemdoua referinte s1 si s2 prin care obiectul poate fi accesat.
 

4. Clasa, instanta

Clasa unui obiect este un tip de data pe baza caruia se pot crea instante din clasa respectiva. Aceste instante sunt obiecte.
Daca doua obiecte sunt in aceaasi stare atunci la aceaasi cerere reactioneaza la fel. Cererile se realizeaza prin trimiterea anumitor mesaje obiectului. Mesajele au forma urmatoare:
referinta_obiect.nume_metoda()

Pentru fiecare obiect se aloca memorie pentru datele obiectului, darmetodele sunt utilizeaza in comun de catre diferite instante.
Un obiect poate sa ceara de la un alt obiect realizarea unei sarcini.Mesajele sunt de fapt apeluri de metode publice ale claselor. Metodelepublice sunt metode accesibile de catre celelalte obiecte. Un obiect poatesa contina si metode private, metode care nu sunt accesibile din afara.In cazul clasei Fereastra metodele afiseaza() si sterge() trebuie sa fiemetode publice, iar daca am dori desenarea unui chenar in jurul ferestreiaceasta am putea-o defini ca o metoda privata.
Obiectele comunica prin mesaje si rolurile sunt distribuite in modulurmator:

client: cel care cere realizarea unei sarcini ( cel care trimitemesajul )
server: cel care executa sarcina (cel care receptioneaza mesajul)
Acelasi obiect poate fi odata client, iar dupa aceea server. Existatotusi obiecte tipice client cum ar fi obiectele de tip control si obiectetipice server, obiecte de tip baza de date. In literatura de specialitateputem sa intalnim si denumirile:
ACTOR: care cere numai
AGENT: care cere si executa
Mesajele au rolul de a activa obiecte si realizeaza schimb de informatieintre obiecte.  Raspunsul la un anumit mesaj se obtine prin valoareareturnata de catre metoda sau prin parametrii transmisi ca referint


Pentru fiecare clasa utilizata in aplicatia noastra se creaza un obiectde tip Class(java.lang.Class) care tine evidenta obiectelor instantiate din clasele respective. Un obiect poate sa spuna din ce clasa este instantiata. Exemplu:

String s="Un sir de caractere";
Class c=s.getClass();    //getClass() - Returneazaun obiect de tip Class
System.out.println( c.getName()); //getName() - Returneaza un obiectde tip String

5. Starile unui obiect

Ca si variabile, obiectele au un ciclu de viata. Se nasc, sunt initializate, dupa care pot fi inactive sau pot fi activate si dupa aceea mor. Numelemetodei care initializeaza obiectul difera de la un mediu de programarela altul:
C++, Java: constructor,o metoda cu numele   clasei cu o lista de parametri si fara tipreturnat. Constructorul are sarcina de a aloca memorie pentru campurilede date si de a le initializa acestea.
Turbo Pascal: Init()
Delphi: Create()

Un constructor de tip Java pentru o fereastra ar avea forma:
 

Fereastra( int Fx, int Fy, int FLatime, int FInaltime )
{
                    x0 = Fx; y0 = Fy;
                    Latime = FLatime; Inaltime = FInaltime;
}
Caracteristicile metodei constructor:

De multe ori la distrugerea obiectelor avem nevoie de dezalocarea resurselor alocate pentru obiect. In C++ dezalocarile sunt facute de catre o metoda speciala numita si destructor. In Java dezalocarea memoriei (alocata cu new) se face de catre Garbage Colector dupa ce nu mai exista nici o referinta a respectivul obiect. Exista insa si metode native pentru care alocarea memoriei  nu s-a facut cu metoda new si in afara de memorie exista si alte resurse alocabile obiectelor: fisiere, conexiuni retea. Pentru dezalocarea acestor resurse Java pune la dispozitie metoda finalize, mostenita din clasa Object si care are urmatoarea signatura:

protected void finalize() throws Throwable{}

Aceasta metoda este apelata de runtime system inainte ca memoria alocata obiectului respectiv sa fie dezalocata de Garbage Colector. Colectorul de gunoi de ruleaza pe un fir de executie demon si nu se stie de dinainte cand va fi planificat pentru executie. Se stie ca metoda finalize se apeleaza inainte ca zona de memorie sa fie reutilizata.
Clasa System insa are o metoda gc() care forteaza executia Garbage Collector si se foloseste impreuna cu runFinalization(). Aceasta metoda forteaza executia metodelor finalize() a obiectelor care nu mai sunt referintiate, dar inca n-au fost finalizate. Cu ajutorul unei alte metode runFinalizerOnExit()  putem seta  flag-ul care indica masinii virtuale daca sa execute sau nu metodele finalize la exit, adica la terminarea executiei masinii virtuale.

public static void gc()
public static void runFinalization()
public static void runFinalizerOnExit()

6. Proprietateade incapsulare. Ascunderea informatiei

Incapsularea inseamna ca datele se definesc impreuna cu codul care actioneaza asupra lor.

Ascunderea informatiei inseamna ca obiectul isi ascunde problemele interne.Datele din interiorul obiectelor sunt accesibile doar prin metode publice.Astfel cei neautorizati nu pot patrunde in interiorul obiectului.

7. Exemplu

Sa se scrie o aplicatie care defineste o clasa stiva si instantieaza obiecte din aceasta clasa.
Diagrama de obiecte:

Diagrama de clase:

Sursa Java:

public class TControl{
        public TControl(){
                TStiva s1, s2;
                int i;
                s1 = new TStiva( 10 );
                s2 = new TStiva( );
                for( i=0; i<10; i++)
                        s1.push( i );
                while( ! s1.empty() )
                        System.out.println( Integer.toString( s1.pop()));
                for( i=10;i<15;i++){
                        s2.push( i );
                        System.out.println( Integer.toString( s2.top()));
                }
        }
        public static void main(String args[] ){
                TControl contro = new TControl();
        }

}

class TStiva{
        int st[];
        int sp;
        int dim;

        public TStiva( int pdim){
                dim = pdim;
                st = new int[ dim ];
                sp = -1;
        }

        public TStiva( ){
                dim = 100;
                st = new int[ dim ];
                sp = -1;
        }

        public void push( inte ){
                sp++;
                st[ sp ] = e;
        }

        public int pop(){
                sp--;
                return st[ sp+1 ];
        }

        public int top(){
                return st[ sp ];
        }

        public boolean empty(){
                return sp==-1;
        }
}