pe obiecte...2. atunci cand analizam un obiect fizic sau o notiune pentru a le reprezenta in memoria...
TRANSCRIPT
PROGRAMARE ORIENTATĂ
PE OBIECTE
01.12.2013 1
Lector dr. Adrian Runceanu
Universitatea “Constantin Brâncuşi” din Târgu-Jiu
Facultatea de Inginerie
Departamentul de Automatică, Energie şi Mediu
1. Terminologia de baza pentru programarea
orientata obiect:
1.1. Obiecte reale si reprezentarea lor in
calculator
1.2. Proprietati (atribute) specifice
1.3. Set de operatii specifice
2. Despre obiecte si referinte in Java:
2.1. Variabile de tip referinta
2.2. Operatii care se pot aplica referintelor
2.3. Declararea si crearea obiectelor
2.4. Operatorul new
2.5. Gestiunea memoriei si colectarea de
gunoaie (garbage collection)
2.6. Transmiterea de parametri referinta la
obiecte catre metodele unui obiect 01.12.2013 3 POO - limbajele C++/Java
1. Terminologia de baza pentru
programarea orientata obiect
Obiectele fizice din lumea reala sau
notiunile sunt reprezentate in memoria
calculatorului in asa fel incat informatiile
specifice lor sa fie pastrate la un loc si sa
se poata prelucra ca un tot unitar.
01.12.2013 4 POO - limbajele C++/Java
1. Pentru a reprezenta in memoria
interna obiecte fizice sau notiuni, este
necesar sa analizam intregul set de
proprietati (atribute) specifice
fiecaruia dintre acestea si sa il
reprezentam prin numere intr-o zona
compacta de memorie.
01.12.2013 5 POO - limbajele C++/Java
Va trebui insa sa avem intotdeauna o
imagine clara a deosebirii fundamentale
dintre un obiect fizic sau o notiune si
reprezentarea acestora in memoria
calculatorului.
De exemplu, in memoria calculatorului
este simplu sa cream un nou obiect,
identic cu altul deja existent, prin simpla
duplicare a zonei de memorie folosita
de obiectul pe care dorim sa il duplicam.
In realitate insa, este mult mai greu sa
obtinem o copie identica a unui obiect
fizic. 01.12.2013 6 POO - limbajele C++/Java
2. Atunci cand analizam un obiect fizic sau o
notiune pentru a le reprezenta in memoria
calculatorului, trebuie sa analizam, nu
numai proprietatile fiecaruia dintre acestea
dar, si setul de operatii specifice care pot
fi executate asupra lor sau cu ajutorul
lor.
Setul de operatii specifice unui obiect
real sau unei notiuni va fi reprezentat in
memoria calculatorului avand in vedere
valorile care formeaza proprietatile obiectului.
Apoi, acest set de operatii va fi
descompus in operatii numerice predefinite in
calculator. 01.12.2013 7 POO - limbajele C++/Java
De exemplu, dorim sa reprezentam in
memoria calculatorului un obiect care sa
descrie o minge de forma sferica, de o
anumita culoare aflata in spatiu.
Pentru aceasta reprezentare, vom defini: o valoare pentru raza sferei
o valoare pentru culoarea mingii
si 3 valori care sa reprezinte coordonatele x, y si
z relativ la un sistem de axe dat
aceste valori numerice vor face parte din setul de
proprietati ale obiectului minge.
01.12.2013 8 POO - limbajele C++/Java
vom defini operatiile specifice obiectului minge, cum ar fi:
mutarea in spatiu a obiectului si umflarea obiectului
de exemplu, la definirea operatiei care reprezinta mutarea in spatiu a obiectului minge este suficient sa folosim operatiile predefinite cu numere pentru a modifica valorile coordonatelor x, y, z.
01.12.2013 9 POO - limbajele C++/Java
In concluzie, din punct de vedere al
programarii calculatoarelor, un obiect
este o reprezentare in memoria
calculatorului:
1. a proprietatilor
2. a setului de operatii specifice unui
obiect real sau unei notiuni
01.12.2013 10 POO - limbajele C++/Java
Observatie:
Descrierea proprietatilor si a setului de
operatii specifice ale obiectului depind de
problema de rezolvat.
In exemplul de mai sus, obiectul minge
este insuficient descris si pentru a simula in
calculator obiectul real este nevoie de
proprietati suplimentare cum ar fi:
◦ materialul din care este confectionat
mingea, etc,
◦ precum si de multe operatii in plus, cum ar
fi:
aruncarea mingei
deformarea mingei
etc. 01.12.2013 11 POO - limbajele C++/Java
Daca problema de rezolvat nu necesita
anumite proprietati si operatii ale unui
obiect real, este preferabil sa nu le definim
in obiectul folosit pentru reprezentarea in
memoria calculatorului.
Cu alte cuvinte, vom defini acelasi obiect
real in diferite feluri pentru a-l reprezenta in
memoria interna, in functie de scopul
problemei de rezolvat.
01.12.2013 12 POO - limbajele C++/Java
1. Terminologia de baza pentru programarea
orientata obiect:
1.1. Obiecte reale si reprezentarea lor in
calculator
1.2. Proprietati (atribute) specifice
1.3. Set de operatii specifice
2. Despre obiecte si referinte in Java:
2.1. Variabile de tip referinta
2.2. Operatii care se pot aplica referintelor
2.3. Declararea si crearea obiectelor
2.4. Operatorul new
2.5. Gestiunea memoriei si colectarea de
gunoaie (garbage collection)
2.6. Transmiterea de parametri referinta la
obiecte catre metodele unui obiect 01.12.2013 13 POO - limbajele C++/Java
Categorii de operatii care se pot aplica
variabilelor referinta
1. Prima categorie de operatii, cu variabile
referinta, permite examinarea si manipularea
valorii referinta.
În Java, singurele operatii care sunt
permise asupra referintelor (cu o singura
exceptie pentru String-uri) sunt:
1. atribuirea prin intermediul operatorului =
2. comparatia prin intermediul operatorilor ==
si !=
01.12.2013 14 POO - limbajele C++/Java
De exemplu, prin atribuirea nr2 = nr1 vom
face ca nr2 sa refere acelasi obiect pe care
il refera nr1, iar expresia nr1 == nr2 este
adevarata, deoarece ambele referinte
stocheaza aceeasi valoare a adresei de
memorie la care se afla obiectul referit.
Observatie:
Alte limbaje de programare, cum ar fi C,
definesc notiunea de pointer care este
similar cu cel al unei variabile referinta.
In limbajul C este permisa aritmetica
pointerilor, pe cand in Java aceasta nu este
permisa.
01.12.2013 15 POO - limbajele C++/Java
2. A doua categorie de operatii, cu variabile referinta, se aplica obiectului care este referit.
Exista trei actiuni fundamentale care pot fi realizate:
1. aplicarea unei conversii explicite de tip 2. accesul la o variabila a obiectului sau
apelul unei metode prin operatorul punct (.)
3. verificarea daca obiectul referit are un anumit tip cu ajutorul operatorului instanceof
01.12.2013 16 POO - limbajele C++/Java
In Java, un obiect este orice variabila care nu este de tip primitiv.
Variabilele obiect sunt manipulate prin
referinte, spre deosebire de variabilele de tipuri primitive care sunt manipulate prin valoare.
Obiectul in sine este stocat undeva in memorie, iar variabila referinta stocheaza adresa de memorie a obiectului.
Astfel, variabila referinta devine un nume pentru acea zona de memorie.
01.12.2013 17 POO - limbajele C++/Java
Operatorul punct (.)
Este folosit pentru a apela o metoda care se aplica
unui obiect.
De exemplu, sa presupunem ca avem un obiect ce
apartine clasei Cerc ( adica de tip Cerc ) care
defineste metoda arie.
Daca variabila cerculMeu este o referinta catre un
obiect de tip Cerc, atunci putem calcula aria cercului
referit prin apelul metodei arie astfel:
Cerc cerculMeu;
Double arieCerc = cerculMeu.arie();
Operatorul punct poate fi folosit si pentru a accesa
atributele individuale ale unui obiect, daca cel care
a proiectat obiectul permite acest lucru.
01.12.2013 18 POO - limbajele C++/Java
Declararea si crearea obiectelor
Declararea si crearea (initializarea)
obiectelor se realizeaza in doi pasi de catre
compilatorul Java:
1. Se declara o variabila referinta la obiect
(instanta a unei clase).
Prin declaratia unei referinte se aloca zona
de memorie necesara stocarii referintei in
sine (adica a unei adrese de memorie).
In consecinta, dupa ce se declara o variabila
referinta, aceasta va contine valoarea null,
ceea ce inseamna ca referinta inca nu indica
o instanta valida.
01.12.2013 19 POO - limbajele C++/Java
Sintaxa folosita pentru declararea unei variabile referinta catre un obiect este:
unde: - <nume_clasa> - reprezinta numele
clasei dupa modelul careia se doreste crearea unei instante;
- <nume_obiect> - reprezinta numele unei variabile referinta la un obiect oarecare de tipul <nume_clasa>; acesta variabila referinta la un obiect contine valoarea null.
01.12.2013 20 POO - limbajele C++/Java
<nume_clasa> <nume_obiect>;
2. Se aloca, efectiv, zona de memorie pentru
obiectul declarat la pasul 1 si se initializeaza
obiectul cu ajutorul operatorului new.
In acest fel, se creaza o noua instanță a
clasei date.
Sintaxa folosita pentru alocarea
memoriei si crearea efectiva a unei
instante a clasei este:
sau
01.12.2013 21 POO - limbajele C++/Java
<nume_obiect> = new <nume_constructor> ();
<nume_obiect> = new <nume_constructor>
(arg1, arg2, …);
unde:
- <nume_obiect> - reprezinta numele variabilei
referinta declarata la pasul 1;
- <nume_constructor> () sau
<nume_constructor> (arg1, arg2, …) - metoda
speciala a clasei obiectului, numita
constructor, care are acelasi nume cu cel al
clasei obiectului urmat de paranteze rotunde
vide sau care pot contine argumente; numarul
si tipul argumentelor folosite sunt definite de
clasa de obiecte.
01.12.2013 22 POO - limbajele C++/Java
Nota:
Parantezele rotunde plasate dupa <nume_constructor> sunt importante si ele nu trebuie omise chiar daca sunt fara argumente.
Daca se foloseste prima forma a operatorului new, in care constructorul este urmat de paranteze goale, este creat un obiect simplu fara a se initializa anumite valori ale variabilelor de instanta; de regula acest tip de constructor este implicit.
01.12.2013 23 POO - limbajele C++/Java
Daca se foloseste a doua forma a operatorului
new, in care constructorul este urmat de paranteze
care contin argumente, atunci aceste argumente
determina valorile initiale ale variabilelor de instanta
sau ale altor variabile folosite de obiectul astfel creat.
Nota:
De cele mai multe ori programatorii combina
declararea si crearea efectiva a obiectului intr-o
singura instructiune, astfel:
sau
01.12.2013 24 POO - limbajele C++/Java
<nume_clasa> <nume_obiect> = new
<nume_constructor>();
<nume_clasa> <nume_obiect> = new
<nume_constructor>(arg1, arg2, …);
Exemple in care constructorul este folosit
fara argumente:
1.
Random nrAleatoare;
nrAleatoare = new Random();
sau
Random nrAleatoare = new Random();
2.
Copil c;
c = new Copil();
sau
Copil c = new Copil();
01.12.2013 25 POO - limbajele C++/Java
Urmatoarele exemple prezinta modalitati de crearea a unor obiecte cu anumite valori initiale, adica folosind argumente in metoda speciala numita constructor: 1. Punct pt = new Punct(0,0); Obiectul de tip Punct cu numele pt este
construit cu doua argumente pentru coordonatele initiale ale punctului.
2. Cerc cerculMeu = new Cerc (0, 0, 10); Obiectul de tip Cerc cu numele cerculMeu
este construit cu trei argumente, doua pentru coordonatele initiale ale centrului si unul pentru lungimea razei.
01.12.2013 26 POO - limbajele C++/Java
Un alt exemplu de creare a mai multor tipuri de obiecte care folosesc diferite tipuri de argumente impreuna cu operatorul new si metoda speciala a clasei numita constructor:
clasa Random, care face parte din pachetul
java.util, creaza obiecte folosite pentru generarea de numere aleatoare intr-un program.
Aceste obiecte sunt numite generatoare de
numere aleatoare si au valori cuprinse in intervalul [0, 1).
01.12.2013 27 POO - limbajele C++/Java
De fapt, un obiect de tip Random extrage
un numar dintr-o multime foarte mare de
numere.
Aceasta tehnica este denumita generare
de numere pseudo-aleatoare si este
folosita in diferite limbaje de programare.
Pentru a extrage un numar diferit din
secventa de numere aleatoare, obiectul de
tip Random trebuie sa primeasca o
valoare initiala denumita “sămânță”
(“seed”).
Aceasta “sămânță” poate fi transmisa
obiectului la construirea sa.
01.12.2013 28 POO - limbajele C++/Java
Programul urmator (NrAleator.java)
creaza obiecte de tip Random folosind
operatorul new in doua moduri cu si fara
argumente ale constructorului.
import java.util.*;
class NrAleator
{
public static void main(String args[ ])
{
Random r1, r2;
01.12.2013 29 POO - limbajele C++/Java
r1 = new Random();
System.out.println("Valoarea aleatoare 1: " +
r1.nextDouble()); // valoarea afisata se schimba
int numar1 = (int) (r1.nextDouble() * 11);
System.out.println("Intreg aleator 1 in
intervalul 0 si 10: " + numar1);
r2 = new Random(8600000);
System.out.println("Valoarea aleatoare 2: " +
r2.nextDouble()); // valoarea afisata nu se schimba
int numar2 = (int) (r2.nextDouble() * 11);
System.out.println("Intreg aleator 2 in
intervalul 0 si 10: " + numar2);
}
}
01.12.2013 30 POO - limbajele C++/Java
Dupa executia programului, pe ecranul
calculatorului se afiseaza:
Valoarea aleatoare 1: 0.6053135148135541
Intreg aleator 1 in intervalul 0 si 10: 9
Valoarea aleatoare 2: 0.7258826590374842
Intreg aleator 2 in intervalul 0 si 10: 9
01.12.2013 31 POO - limbajele C++/Java
In acest exemplu doua obiecte Random diferite sunt create folosind argumente diferite pentru constructorul clasei Random introdus dupa operatorul new.
Primul obiect, cu numele r1, a fost creat cu new Random() fara argumente, deci acest obiect are ca “sămânța” ceasul calculatorului (ora curenta).
Apelarea metodei nextDouble() a obiectului de tip Random produce extragerea urmatoarei valori din secventa de numere pseudo-aleatoare.
Valoarea obtinuta prin folosirea metodei nextDouble() difera de la o executie la alta a programului.
01.12.2013 32 POO - limbajele C++/Java
Al doilea, cu numele r2, a fost creat cu new
Random(8600000) deci, cu un argument
dat de un numar intreg.
De aceea, numarul aleator obtinut prin
folosirea metodei nextDouble() ramane
intotdeauna acelasi, indiferent de cate ori se
executa programul.
Acest lucru poate fi folositor pentru crearea
unor date de test pentru programe.
01.12.2013 33 POO - limbajele C++/Java
Nota:
In programul de mai sus s-au mai
introdus doua instructiuni care inmultesc un
numar aleator cu 11 si stocheaza produsul
ca intreg:
int numar1 = (int) (r1.nextDouble() * 11);
int numar2 = (int) (r2.nextDouble() * 11);
Intregul continut de variabilele numar1 si
numar2 va fi un numar aleator cuprins intre
0 si 10.
01.12.2013 34 POO - limbajele C++/Java
Rolul operatorului new
La folosirea operatorului new se
executa urmatoarele:
1. se creaza o noua instanta a clasei date
2. se aloca memorie pentru aceasta
instanta
3. se apeleaza o metoda speciala a
clasei numita constructor
01.12.2013 35 POO - limbajele C++/Java
Constructorii reprezinta metode speciale
pentru crearea si initializarea noilor
instante ale claselor.
Constructorii: ◦ initializeaza noul obiect si variabilele sale
◦ creeaza orice alte obiecte de care are nevoie
obiectul creat
◦ realizeaza orice alte operatii de care obiectul
are nevoie la initializarea sa
Intr-o clasa pot exista mai multe definitii de
constructori, fiecare avand un numar diferit
de argumente sau de tipuri.
01.12.2013 36 POO - limbajele C++/Java
Cand se foloseste operatorul new, se
pot specifica diferite argumente in lista
de argumente si va fi apelat
constructorul corespunzator pentru
acele argumente.
Intr-o clasa pot fi definiti oricâți
constructori se doresc pentru a
implementa comportamentul clasei.
01.12.2013 37 POO - limbajele C++/Java
Gestiunea memoriei și colectarea de gunoaie
(garbage collection)
Gestiunea memoriei in Java se face dinamic si automat.
Atunci cand se creaza un obiect nou, Java aloca
automat o zona de memorie de dimensiunea
corespunzatoare obiectului.
Nu trebuie sa se aloce explicit memorie pentru
obiecte.
Deoarece gestiunea memoriei in Java se face
automat, nu este nevoie sa dezalocam explicit
memoria ocupata de obiect atunci cand am terminat
de lucru cu aceasta.
In Java cand un obiect din memorie nu mai este referit
de nici o variabila, memoria pe care o consuma va fi
eliberata automat.
Aceasta tehnica se numeste colectare de gunoaie.
01.12.2013 38 POO - limbajele C++/Java
Interpretarea operatorului de atribuire (=) pentru referinte
Daca x si y sunt referinte (de tipuri compatibile) atunci instructiunea
x = y inseamna ca valoarea adresei stocata in y este
transferata in variabila referinta x. Rezulta ca, dupa operatia de atribuire, x va referi
acelasi obiect ca si y. Ceea ce se copiaza in acest caz sunt adrese. Obiectul pe care x il referea inainte de operatia de
atribuire nu mai este referit de x dupa operatia de atribuire.
Daca x a fost singura referinta catre acel obiect, atunci obiectul respectiv nu mai este referit de nici o variabila si este disponibil pentru colectarea de gunoaie.
01.12.2013 39 POO - limbajele C++/Java
Nota:
Sa retinem faptul ca, obiectele nu se
copiaza prin operatorul de atribuire (=).
De exemplu, secventa de instructiuni
de mai jos:
Cerc cerc1 = new Cerc (0,0,10); // un cerc de
raza 10
Cerc cerc2 = cerc1;
Ne spune ca s-a construit un singur
obiect de tip Cerc, cu numele cerc1
(prima instructiune) si ca cerc2 este un
alt nume dat pentru cerc1 (a doua
instructiune). 01.12.2013 40 POO - limbajele C++/Java
Transmiterea de parametrii referinta la obiecte catre metodele unui obiect
În Java transmiterea parametrilor se face prin
valoare. Datorita acestui fapt, parametrii actuali (de apel)
se transpun in parametri formali, din definitia metodei, folosind atribuirea obisnuita.
Daca parametrul transmis este un tip referinta, atunci se stie deja ca, prin atribuire, atat parametrul formal, cat si parametrul de apel vor referi acelasi obiect.
Orice metoda aplicata obiectului referit prin parametrul formal este, implicit, aplicata si obiectului referit prin parametrului de apel.
01.12.2013 41 POO - limbajele C++/Java
De exemplu, sa presupunem ca dorim sa modificam raza unui cerc folosind o metoda denumita modifica().
Secventa de cod care apeleaza metoda modifica() este:
int v = 4; Cerc cerc = new Cerc(); modifica(cerc, v); Metoda modifica() de mai jos primeste ca
parametri o referinta la un obiect de tip Cerc si o valoare intreaga:
public void modifica (Cerc cerculMeu, int val) { cerculMeu.setRaza (val); // modifica raza
obiectului apelant val += 4; // nu are nici un efect asupra
parametrului actual }
01.12.2013 42 POO - limbajele C++/Java
Observatie:
Metoda setRaza() modifica raza unui cerc
oarecare si codul-sursa al acesteia nu este
necesar a fi prezentat in acest context.
Secventa de cod care apeleaza metoda
modifica() va avea ca efect modificarea
razei obiectului cerc la 4, deoarece atat
variabila referinta cerc cat si variabila
referinta cerculMeu indica acelasi obiect,
dar valoarea lui v va ramane nemodificata.
01.12.2013 43 POO - limbajele C++/Java
Interpretarea operatorului de egalitate (==) pentru referinte
Doua variabile referinta sunt egale via == daca
ele refera acelasi obiect (sau ambele sunt valori null).
De exemplu: Cerc cerc1 = new Cerc(0, 0, 15); //un cerc de raza 15
Cerc cerc2 = new Cerc(0, 0, 15); //un cerc de raza 15
Cerc cerc3 = cerc2; In acest caz avem doua obiecte: un obiect cu numele
cerc1 si un obiect cu doua nume cerc2 si cerc3. Expresia cerc2 == cerc3 este adevarata. Expresia cerc1 == cerc2 este falsa, desi variabila
cerc1 si variabila cerc2 refera obiecte care au valori egale (ambele sunt cercuri cu centrul in origine si raza 15).
01.12.2013 44 POO - limbajele C++/Java
Un exemplu simplu de aplicatie Java care
foloseste variabile si metode de instanta
Programul urmator (Copil.java) ilustreaza cum
sunt definite variabilele si metodele de instanta
intr-o clasa numita Copil, cum este folosit
operatorul new pentru crearea unei instante a
clase Copil cu numele c si cum sunt apelate
metodele de instanta in cadrul aplicatiei.
Variabilele de instanta sunt definite astfel:
String culoare_piele;
String sex;
boolean flamand;
01.12.2013 45 POO - limbajele C++/Java
Doua dintre variabile care desemneaza culoarea
pielii si sexul contin obiecte de tip String (sir).
Un obiect String in Java este creat folosind una
din clasele standard din biblioteca de clase Java.
Clasa String este folosita pentru pastrarea
textului si pentru diferite functii de manipulare a
textului.
A treia variabila desemneaza starea de flamand
a copilului si pastreaza doua valori: true (pentru
flamand) si false (pentru hranit).
Comportamentul clasei Copil poate fi dat de o
multitudine de metode care sa descrie actiuni pe
care le-ar putea face un copil (se hraneste, se
joaca, se imbraca etc).
01.12.2013 46 POO - limbajele C++/Java
Totusi, in program sunt definite doar doua metode:
1. una pentru a hrani copilul (denumita hranescCopil)
2. una pentru a verifica si afisa atributele (proprietatile) copilului
(denumita afisezAtributeCopil)
Iata codul sursa al aplicatiei:
class Copil
{
String culoare_piele;
String sex;
boolean flamand;
void hranescCopil()
{
if (flamand==true)
{ System.out.println("Bun - lapte");
flamand = false; }
else
System.out.println("Nu, multumesc - am mancat deja");
}
01.12.2013 47 POO - limbajele C++/Java
void afisezAtributeCopil()
{
System.out.println("Acesta este un copil de sex " +sex+" si " +
culoare_piele +" .");
if (flamand == true) System.out.println("Copilul este flamand.");
else System.out.println("Copilul este satul");
}
public static void main(String args[ ]) {
Copil c = new Copil();
c.culoare_piele = "alb";
c.sex = "masculin";
c.flamand = true;
System.out.println("Atribute copil");
c.afisezAtributeCopil();
System.out.println("Hranesc copilul");
c.hranescCopil();
System.out.println("Atribute copil");
c.afisezAtributeCopil();
System.out.println("Hranesc copilul");
c.hranescCopil();
}
}
01.12.2013 48 POO - limbajele C++/Java
Un tablou este o structura de date care poate sa pastreze mai multe valori de acelasi tip (primitiv sau referinta), memorate intr-o zona de memorie contigua si reunite sub un nume simbolic comun (numele tabloului).
Un tablou poate fi: 1. unidimensional sau vector 2. bidimensional sau matrice 3. multidimensional In Java, un tablou este tratat ca un
obiect, deci el este un tip referinta.
01.12.2013 50 POO - limbajele C++/Java
Declararea si crearea unui tablou
unidimensional
Declararea si crearea tablourilor
unidimensionale se realizeaza in doi pasi de
catre compilatorul Java:
1. Se declara o variabila referinta la tablou de
un anumit tip (primitiv sau referinta).
Prin declaratia unei referinte se aloca zona
de memorie necesara stocarii referintei in
sine (adica a unei adrese de memorie).
In consecinta, dupa ce se declara o variabila
referinta la un tablou, aceasta va contine
valoarea null, ceea ce inseamna ca referinta
inca nu indica un tablou valid.
01.12.2013 51 POO - limbajele C++/Java
Sintaxa folosita pentru declararea unei
variabile referinta catre un tablou
unidimensional este:
sau
unde:
- <tip> - specifica tipul de date primitiv sau tipul de
obiecte (dat de clasa) al elementelor tabloului;
- <nume_tablou> - reprezinta numele unei variabile
referinta la tabloul de tipul <tip>; acesta variabila
referinta la un tablou contine valoarea null.
Nota: parantezele drepte sunt obligatorii, nu
delimiteaza o constructie optionala 01.12.2013 52 POO - limbajele C++/Java
<tip> [ ] <nume_tablou>;
<tip> <nume_tablou> [ ];
2. Se aloca, efectiv, zona de memorie pentru
tabloul declarat la pasul 1 si se initializeaza
tabloul.
Exista doua modalitati pentru a face acest
lucu:
a) folosind operatorul new
b) initializand direct continutul tabloului
01.12.2013 53 POO - limbajele C++/Java
a) Sintaxa folosita pentru alocarea zonei de memorie a unui tablou unidimensional folosind operatorul new este:
unde: - <nume_tablou> - reprezinta numele variabilei
referinta declarata la pasul 1; - <tip> - specifica tipul de date primitiv sau tipul
de obiecte (dat de clasa) al elementelor tabloului;
- <nr_elem> - reprezinta numarul de elemente ale tabloului; poate fi o variabila de un tip primitiv, o expresie de un tip primitiv sau o constanta de un tip primitiv.
01.12.2013 54 POO - limbajele C++/Java
<nume_tablou> = new <tip> [<nr_elem>];
Nota:
1. De cele mai multe ori programatorii combina
declararea si alocarea zonei de memorie pentru
un tablou intr-o singura instructiune, astfel:
sau
2. La crearea unui tablou folosind operatorul new,
toate elementele sale vor fi initializate automat:
cu 0 pentru cele numerice
cu false pentru boolean
cu ‘\0’ pentru tablouri tip caracter
cu null pentru obiecte
01.12.2013 55 POO - limbajele C++/Java
<tip> <nume_tablou> [ ] = new <tip> [<nr_elem>];
<tip> [ ] <nume_tablou> = new <tip> [<nr_elem>];
De exemplu, pentru declararea si
alocarea zonei de memorie pentru un
tablou unidimensional cu numele temp
de tipul int cu 100 de elemente se
foloseste instructiunea:
int [ ] temp = new int[100];
01.12.2013 56 POO - limbajele C++/Java
b) Alocarea zonei de memorie pentru tablou se poate face initializand direct continutul tabloului (la fel ca in limbajul C/C++), dupa urmatoarea sintaxa:
sau unde: - <valoare1>, <valoare2>, …. - reprezinta
valorile de initializare al caror numar determina si numarul de elemente ale tabloului.
01.12.2013 57 POO - limbajele C++/Java
<tip> [ ] <nume_tablou>;
<nume_tablou> = {<valoare1>, <valoare2>, ….};
<tip> [ ] <nume_tablou> = {<valoare1>, <valoare2>,
….};
De exemplu, pentru declarea si alocarea
zonei de memorie pentru un tablou
unidimensional cu numele temp de tip int cu
patru elemente se foloseste instructiunea:
int [ ] temp = {3, 4, 6, 19};
01.12.2013 58 POO - limbajele C++/Java
Declararea si alocarea zonei de memorie pentru un tablou unidimensional de obiecte (deci nu tipuri primitive) foloseste aceeasi sintaxa.
Trebuie retinut insa ca dupa alocarea zonei de memorie pentru tabloul de referinte la obiectele respective, fiecare element (de tip referinta) din tablou va avea valoarea null.
Apoi, pentru fiecare element-tip referinta din tablou trebuie alocata memorie, separat, corespunzatoare fiecarui obiect referit.
Aceasta se intampla, deoarece un tablou de obiecte in Java este un tablou de referinte la obiectele respective.
01.12.2013 59 POO - limbajele C++/Java
De exemplu, pentru declararea si alocarea memoriei pentru un tablou de tip Cerc cu numele tablouDeCercuri care are ca elemente 5 obiecte (instante) se foloseste urmatoarea secventa de instructiuni: Cerc [ ] tablouDeCercuri; // declaram un tablou de
referinte de tip Cerc
tablouDeCercuri = new Cerc[5]; //alocam memorie pentru 5 referinte la obiecte de tip Cerc
for (int i = 0; i < 5; i++) { tablouDeCercuri[i] = new Cerc(); // se aloca
memorie pentru un obiect de tip Cerc in elementul i al tabloului cu numele tablouDeCercuri
}
01.12.2013 60 POO - limbajele C++/Java
Lungimea tablourilor unidimensionale
Tablourile Java sunt alocate dinamic, ceea
ce inseamna ca ele isi pot schimba
dimensiunile pe parcursul executiei
programului.
Numarul de elemente care pot fi stocate
intr-un tablou oarecare, este permanent retinut
in variabila <nume_tablou>.length.
De exemplu:
float [] tablou = new float [25];
int dimensiune = tablou.length; // dimensiune primeste
valoarea 25
01.12.2013 61 POO - limbajele C++/Java
Accesarea (identificarea) unui element
al tabloului unidimensional
Deoarece elementele unui tablou sunt
memorate in ordine, unul dupa altul, intr-o zona
contigua, pentru a accesa (sau a referi) un
element al unui tablou se specifica numele
tabloului din care face parte elementul si pozitia
sa in tablou, prin numarul sau de ordine
(numerotarea incepe de la 0), astfel:
in care:
<indice> reprezinta numarul de ordine al
elementului in tablou, cuprins intre 0 si
<nr_elemente> - 1;
parantezele patrate ([ ]) constituie operatorul de
indexare. 01.12.2013 62 POO - limbajele C++/Java
<nume_tablou>[<indice>]
Exemple: int punctaje[5]; elementele tabloului sunt: punctaje[0], punctaje[1],
punctaje[2], …. punctaje[4]. Nota: Toate pozitiile unui tablou sunt verificate, de interpretorul Java, daca se incadreaza in limitele tabloului asa cum s-au specificat la crearea tabloului. In Java este imposibil sa se acceseze sau sa se atribuie o valoare unei pozitii a tabloului aflata in afara granitelor acestuia. Pentru a se evita, in programe, depasirea accidentala a sfarsitului tabloului se testeaza lungimea acestuia prin folosirea variabilei de instanta length.
01.12.2013 63 POO - limbajele C++/Java
O parcurgere a unui tablou unidimensional se face cu ajutorul instructiunii for astfel:
for (int i = 0 ; i < numere.length; i++) numere[i] = i; Observatie: Dat fiind ca tabloul este un tip referinta, operatorul
de atribuire (=) nu copiaza tablouri. De aceea, daca x si y sunt tablouri, efectul
secventei de instructiuni: int [ ] x = new int [50]; int [ ] y = new int [50]; … x = y; este ca x si y refera acum al doilea tablou cu
numele y.
01.12.2013 64 POO - limbajele C++/Java