PE OBIECTE...2. Atunci cand analizam un obiect fizic sau o notiune pentru a le reprezenta in memoria...

65
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

Transcript of PE OBIECTE...2. Atunci cand analizam un obiect fizic sau o notiune pentru a le reprezenta in memoria...

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

Curs 14

Limbajul 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 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

Notiuni suplimentare – tablouri

unidimensionale(vectori)

01.12.2013 49 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

Întrebări?

01.12.2013 65 POO - limbajele C++/Java