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:
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.
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 :
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;
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
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).
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
Fiecare obiect tine o proprie zona de memorie pentru campurile sale.Campurile nu sunt comune intre obiecte.
Exemplu:
class DataOnlyMetodele
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
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
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 |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |