Creeaza.com - informatii profesionale despre


Evidentiem nevoile sociale din educatie - Referate profesionale unice
Acasa » referate » informatica
Ce este Programarea Orientata pe Obiecte?

Ce este Programarea Orientata pe Obiecte?


Ce este Programarea Orientata pe Obiecte?

Programarea Orientata pe Obiecte reprezinta un mod general de a rezolva problemele (care pot fi rezolvate prin programare) folosind abstractiuni ce permit modelarea problemei independent de platforma pe care va rula implementarea.

Toate limbajele de programare ofera abstractiuni.Se poate afirma chiar ca dificultatea/complexitatea problemelor pe care le putem rezolva este in directa relatie cu tipul si calitatea abstractiei oferite. De exemplu limbajul de asamblare este o abstractizare redusa a masinii fizice. Limbajele 'imperative' care i-au urmat ( Fortran,Basic,C) sunt abstractizari ale limbajului de asamblare si, desi reprezinta imbunatatiri majore ale limbajului de asamblare, ne obliga sa gandim in functie de structura calculatorului in loc sa ne gandim in termenii problemei pe care dorim sa o rezolvam. Programatorul trebuie sa gaseasca o transpunere a problemei din 'spatiul problema'(adica spatiul unde problema exista,de exemplu viata reala) in 'spatiul solutie'(spatiul in care dorim sa modelam problema,adica calculatorul). Efortul necesar pentru a realiza aceasta mapare da nastere la programe dificil de scris si greu de intretinut.

In evolutia lor dinspre spatiul masina spre spatiul problema, limbajele de programare au cunoscut o noua forma, aceea a limbajelor orientate obiect. De fapt ce este un Obiect (software)? O definitie (simpla) ar putea fi: un element software care grupeaza un set de variabile si un set de metode inrudite.

Abordarea Programarii Orientate pe Obiecte ( Object Oriented Programming,OOP) ofera un mod de a reprezenta elemente din spatiul problema si aceasta reprezentare este destul de generala astfel incat nu suntem constransi la un anumit tip de problema. OOP permite descrierea solutiei (programului) in termenii problemei si nu in termenii computerului unde solutia va fi implementata, fiecare 'obiect software' putand fi maparea in limbajul de programare a unui obiect din lumea reala ('spatiul problema'). Ca si toate obiectele din lumea reala,obiectele OOP au caracteristici si comportamente care permit rezolvarea problemelor propuse.

Pe langa maparea obiectelor din lumea reala, programarea orientata obiect mai ofera si:



  • Modularitate: Programul este impartit in obiecte care comunica prin interfete bine stabilite, codul pentru un obiect poate fi implementat si mentinut independent de codul pentru celelalte obiecte.
  • Ascunderea implementarii: Un obiect poate fi folosit de catre un altul printr-o interfata publica fara cunoasterea efectiva a implementarii acestuia. In plus un obiect poate avea elemente private sau accesibile doar din anumite contexte (incapsulare).

Toate obiectele, desi unice, apartin fiecare unei clase de obiecte care au acelasi comportament si caracteristici. Ca exemplu se poate considera clasa Persoana si atunci orice om este un obiect al clasei Persoana.  In contextul OOP o 'clasa' reprezinta un tip de date, un prototip care defineste variabilele si metodele comune tuturor obiectelor de un anumit tip (din fac parte din clasa respectiva de obiecte). De notat ca din punct de vedere conceptual un obiect anume poate apartine mai multor clase , fapt normal de altfel : presupunand ca avem clasa PersoanaCaucaziana si clasa PilotDeAvion un pilot caucazian va apartine ambelor clase de obiecte.

Introducere in JAVA

Java este un limbaj de programare orientat obiect care cunoaste la ora actuala o mare raspnadire fiind utilizat foarte mult in dezvoltarea web dar si in alte domenii ale IT.

Spre deosebire de limbajele de programare tradionale (C,Basic,etc) care au ca rezultat al compilarii un fisier executabil, Java produce in urma compilarii fisiere continand un limbaj intermediar numit bytecode. Acest limbaj nu poate fi rulat direct de catre o masina fizica (PC, mobil, etc) si este rulat intr-o masina virtuala Java (Java Virtual Machine,JVM), un intepretor (la runtime) pentru acest limbaj care este scris pentru fiecare tip de masina fizica pentru care se doreste rularea Java. Acest lucru , desi scade viteza de executie a programului ( Java este mai lenta decat C++ de la 3 pana la 5 ori ) ofera o portabilitate care nu exista in nici un alt limbaj de programare (neinterpretat). Altfel spus,odata scris si compilat un program Java poate fi rulat pe orice hardware care are o masina virtuala Java fara macar a recompila programul. In plus, tot datorita acestui fapt, rularea Java se poate face in conditii mult mai sigure decat a unui program neinterpretat (compilat in cod nativ). Acest lucru, colaborat cu principiul "write once,run anywhere" (enuntat anterior) si cu faptul ca Java este un limbaj orientat obiect care usureaza mult munca programatorilor au facut ca Java sa cunoasca o raspandire foarte mare.

I. Cel mai simplu program - HelloWorld

class HelloWorld

Salvam programul de mai sus in fisierul HelloWorld.java

Pentru compilare executam la linia de comanda : javac HelloWorld.java
unde javac este un compilator care transforma codul sursa Java (fisierul.java) in limbajul interpretat (bytecode) din fisierul.class .

Compilarea reusita va avea ca efect aparita unui fisier numit HelloWorld.class

Rulare efectiva se face: java HelloWorld
unde java este numele programului care implementeaza masina virtuala si HelloWorld este numele clasei care contine main-ul. Masina virtuala va interpreta in acest caz codul din fisierul HelloWorld.class

Pe ecran va aparea mesajul "Hello world!"

Explicatii:

class HelloWorld - declara un nou tip de date (o clasa de obiecte).Definitia clasei se afla intre acolade

public static void main(String arg) - este o definitie de metoda a clasei.

- "main" este numele metodei

- metoda are un singur parametru de tip "vector de obiecte String" reprezentand parametrii trimisi din linia de comanda ( asemanator cu int argc,char** argv din c)

- "void" este tipul intors de metoda

- "static" semnifica faptul ca metoda main poate fi apelata fara a avea in prealabil nici un tip de obiect HelloWorld

De notat ca java poate incepe executia doar cu numele unei clase care are o metoda "main" ,statica si care primeste ca parametru o lista de stringuri. Aceasta restrictie este asemanatoare cu restrictie pentru "main" din C

II. Tipuri de date ,obiecte ,referinte

Tipurile de date in Java sunt de doua tipuri :

  • tipuri de date primitive

Tip primitiv

Dimensiune

Minim

Maxim

boolean

char

16-biti

Unicode 0

Unicode 216- 1

byte

8-biti

short


16-biti

int

32-biti

long

64-biti

float

32-biti

IEEE754

IEEE754

double

64-biti

IEEE754

IEEE754

void

Tipurile de date primitive sunt asemanatoare celor din C. Variabilele de tipuri primitive sunt create pe stiva (exact ca in C doar ca aici este vorba de stiva masinii virtuale) si sunt accesate prin valoare.

Exemplu de declaratie:

            int i,j;

            boolean k;

  • Clase si obiecte

Clasele reprezinta tipuri de date introduse de utilizator ( folosind cuvantul cheie class) sau deja existente in sistem (cum ar fi System,String,etc)

Declararea unei variabile obiect se face precizand clasa din care face parte si numele variabilei.

Exemplu : pentru a declara un obiect de tip "sir de caractere" se foloseste clasa String ('String' este numele clasei):

String s;

s = new String("Primul meu string");

s = new String("Al doilea string");

Tablouri

Un tablou in Java poate fi format din tipuri primitive sau din obiecte si se declara in modul urmator:

int[ ] a; <=> int a[ ];

Integer[ ] b; <=> Integer b[ ]; // unde Integer este numele unei clase predefinite in Java

O diferanta notabila fata de C este aceea ca dimensiunea se poate stabili la run-time si nu este obligatoriu o constanta.

Exemple de intitializare:

a=new int[4]; // se creaza tablou cu 4 elemente initializate cu 0
sau:
a=; // se creaza tablou cu 3 elemente initializate cu valorile date

b=new Integer[2]; //se creaza tablou cu 2 elemente initializate cu null
sau:
b=

Pot exista si tablouri multidimensionale:

int a[ ][ ];

a=new int[2][2];
sau:
a=, }
sau :
a = new int[5][ ];
a[2] = new int[3];

Obiectele si tablourile sunt accesate folosind referinte

Atunci cand declaram o variabila obiect ( ex. String s) (similar pentru tablouri) aceasta este de fapt o referinta la un obiect obiect de tipul dat. Poate fi facuta o paralela simpla si amuzanta: o referinta este o telecomanda iar obiectul este un televizor. Daca dorim sa dam volumul mai tare,vom apasa un buton pe telecomanda care va trasmite televizorului comanda "volum mai mare". De notat ca telecomanda poate exista fara televizor (adica o referinta exista si fara un obiect asociat) dar si televizorul poate exista fara telecomanda ( adica pot exista si obiecte catre care nu exista referinte).

Cand declaram o variabila obiect sau de tipul unui array, ea este o referinta la o valoare speciala care are si un cuvant cheie asociat: null. Daca vom incerca sa folosim o referinta nula masina virtuala (sau uneori chiar compilatorul) vor semnala ca eroare acest lucru .

Orice obiect sau tablou trebuie initializat

Initializarea se face folosind cuvantul cheie new.

Semnificatia liniei s = new String("Primul meu string") este ca se creaza si initializeaza un obiect de tipul String si referinta catre el este salvata in s. Ceea ce urmeaza dupa new este numele clasei scris sub forma de metoda si anumiti parametrii pasati acesteia. Aceasta metoda speciala poarta numele de constructor si va fi explicata in laboratorul viitor.

Atunci cand se executa linia : s = new String("Al doilea string") , se va crea un nou obiect string,referinta catre el este salvata in s.Se observa ca referinta catre primul obiect se pierde. Primul obiect ramane in memorie, doar ca nu mai exista nici o referinta la el (televizor fara telecomanda).

III. Definirea unei clase

Daca "totul este un obiect" ce anume determina modul in care o clasa de obiecte se comporta,ce anume specifica tipul obiectului. Ei bine tipul este definit folosind cuvantul cheie class.

O clasa este un tip de date definit de utilizator. O clasa noua este introdua cu cuvantul cheie class

(public|private|protected|friendly) class NumeClasa

(public|private|protected|friendly) - reprezinta specificatori de access ai clasei si vor fi explicati in laboratoarele viitoare.

Noul tip va fi numit NumeClasa.
Definita clasei este data intre acolade. In cazul de fata continutul definitia clasei este doar un comentariu.

In definitia unei clase pot exista 2 tipuri de entitati :

a) Campuri (atribute,date membru)

Un camp este un obiect de orice tip sau o o variabila de tip primitiv.  Daca este un obiect atunci acest camp trebuie initializat inainte de a fi folosit (cuvantul cheie new)

Fiecare obiect tine o proprie zona de memorie pentru campurile sale.Campurile nu sunt comune intre obiecte.

Exemplu:

class DataOnly
Declaram un  obiect de tip DataOnly si il initializam:
DataOnly d;
d = new DataOnly();

//setam campul i al obiectului d la valoarea 0;

d.i = 1;

Observam ca pentru a folosi un camp dintr-o obiect este de ajuns sa punem numele obiectului urmat de "."(punct) si de numele campului.
 

b) Metode (functii membru)

Metodele in Java sunt "un mod de a face ceva". Ele sunt echivalente functiilor (subrutinelor) din limbajele de programare traditionale.
Metodele determina tipul 'mesajelor' pe care un obiect la poate primi de la un alt obiect.

Modul de definire a unei metode este:

returnType methodName(/*argument list*/)

returnType este tipul valorii intoarse de metoda. Lista de argumente da tipul si numele informatiei pe care dorim sa o transmitem metodei. Numele metodei si lista de argumente determina unic o metoda.

Metodele in Java pot fi create doar ca o parte a unei clase. Pentru a apela o metoda trebuie sa avem un obiect si acel obiect trebuie sa fie capabil sa executa acel apel de metoda. Daca incercam sa executam o metoda gresita pentru un tip de obiect compilatorul va da un mesaj de eroare. O metoda este apelata specificand numele obiecutului urmat de "."(punct) si numele metodei,urmat de lista de parametri intre paranteze.

Presupunand ca avem metoda f() care intoarce int si un obiect a care permite apelarea lui f()

Atunci int x = a.f(); stocheaza in variabila de tip int valoarea intoarsa de functia f

class A

Metoda getVal intoarce valoarea membrului val al obiectului de tipul A. Pentru a intoarce o valoare dintr-o metoda se foloseste cuvantul cheie "return" urmat de o expresie care reprezinta valoare de intors. Intr-o metoda care intoarce void cuvantul cheie return este folosit doar pentru a specifica terminarea metodei

Modificatorul "static"

Daca declaram o metoda sau un camp cu modificatorul "static" nu mai avem nevoie de un obiect de tipul respectiv (clasa respectiva) pentru a folosi acel membru (camp sau metoda).

Aceasta inseamna ca metoda/camp static este o element care nu apartine de un anumit obiect ci mai degraba de tipul respectiv (clasa) comun tuturor obiectelor de acel tip. Campul static este tinut o singura data in memorie pentru fiecare clasa (spre desobire de campurile ne-statice,sau apartinand obiectelor).

Exemplu

class A

            public int setVal(int v)

A.staticVal = 1000;//valid,staticVal apartine clasei nu unui obiect anume;

A.val = 10;//eroare - val nu este static,poate fi folosit doar in cadrul unui obiect

A a = new A();

a.val = 10//valid , a este obiect de tip A

a.staticVal = 1500;//valid,se foloseste valoarea statica din clasa A

A.getInt() ;// valid,getInt e static

A.setVal(10);//invalid , setVal nu e statica

Cuvantul cheie 'this'

In cadrul unei metode nestatice a unui obiect, programatorul poate avea acces la o referinta catre obiectul curent print cuvnatul cheie this. Aceasta referinta poate fi utila pentru a elimina ambiguitatile sau a se transmite pe sine ca parametru pentru o metoda a altui obiect.

Exemplu de rezolvare a ambiguitatii:

class A

Ca o nota de implementare, metodele unei clase sunt tinute in memorie intr-o zona speciala. Deoarece ele nu au cum sa stie care este obiectul pentru care au fost apelate (exista o singura definitie a metodei pentru fiecare clasa, indiferent de numarul de obiecte din clasa respectiva) masina virtuala transmite ca parametru ascuns fiecarei metode o referinta la obiectul curent. In cadrul metodei obiectul curent este accesibil folosind cuvantul cheie this. In metoda setVal folosim this pentru a specifica campul val al obiectului curent ( definitia sa a fost ascunsa de numele paramterului cu acelasi nume)





Politica de confidentialitate


creeaza logo.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.