Sunteți pe pagina 1din 7

M. Joldo ndrumtor de laborator 5.

Clase, obiecte i tablouri


U.T. Cluj-Napoca Programare orientat pe obiecte 1

Clase, obiecte i tablouri

1 Constructori

La crearea unei noi instane a unei clase (un obiect nou) folosind cuvntul cheie new, este invocat un
constructor pentru clasa respectiv. Constructorii sunt folosii pentru a iniializa variabilele instan
(cmpurile) unui obiect. Constructorii sunt asemntori metodelor, dar exist cteva diferene
importante.
Numele constructorului este numele clasei. Un constructor trebuie s aib acelai numele le fel cu
clasa n care se afl.
Constructorul implicit. Dac nu definii un constructor pentru o clas, compilatorul creeaz automat un
implicit, fr parametri. Constructorul implicit invoc constructorul implicit pentru printe (super()) i
iniializeaz toate variabilele instan la valorile implicite (zero pentru tipurile numerice, null pentru
referine la obiecte i false pentru booleene).
Constructorul implicit este creat numai atunci cnd nu sunt definii constructori. Dac definii
constructori pentru o clas, atunci nu se mai creeaz automat un constructor implicit.
Diferene ntre metode i constructori :
Constructori nu au tip returnat. Valoarea este obiectul nsui aa c nu este nevoie s se indice o
valoare returnat.
Nu exist instruciune return n corpul constructorului.
Prima linie din corpul constructorului trebuie s fie ori un apel la un alt constructor al aceleiai
clase (folosind this), ori un apel al constructorului superclasei (folosind super). Dac prima linie
nu este nici unul dintre apeluri, compilatorul insereaz automat un apel la constructorul fr
parametri al superclasei.

Aceste diferene de sintax dintre un constructor i o metod sunt uneori greu de vzut n surs. Poate ar
fi fost mai bine s existe un cuvnt care s marcheze clar constructorii, aa cum sunt n unele limbaje.
this(...) Apeleaz un alt constructor din aceeai clas. Adesea un constructor cu mai putini parametri
apeleaz un constructor cu mai muli parametri dnd valori implicite parametrilor care nu sunt prezeni.
Folosii acest apel pentru constructori din aceeai clas.
super(...). Folosii super pentru a apela un constructor dintr-o clas printe. Apelul constructorului
pentru superclas trebuie s fie prima instruciune din corpul unui constructor. Dac constructorul implicit
al superclasei satisface nevoile, atunci nu este nevoie s facei apelul, deoarece acesta se va face
automat. Super va fi folosit i exemplificat la capitolul despre motenire.

Exemple de apel explicit al constructorului this:

public class Point {
int m_x;
int m_y;

//============ Constructor
public Point(int x, int y) {
m_x = x;
m_y = y;
}

//============ Constructor fara parametri
public Point() {
this(0, 0); // Apeleaza alt constructor.
}
. . .
}

M. Joldo ndrumtor de laborator 5. Clase, obiecte i tablouri
U.T. Cluj-Napoca Programare orientat pe obiecte 2
2 Tablouri

Un tablou poate stoca valori de acelai fel. Fiecare valoare poate fi accesat prin specificarea unui indice.
"Tablou" n Java nseamn aproximativ acelai lucru ca tablou, matrice sau vector n matematic.
Spre deosebire de matematic, un tablou Java trebuie declarat i trebuie s i se aloce o cantitate fix de
memorie.

2.1 Declararea unui tablou

Un tablou este ca alte variabile trebuie declarat, adic trebuie specificat tipul elementelor din tablou.
Toate elementele trebuie s fie de acelai tip.. Se scrie numele tipului elementelor, apoi "[]", apoi numele
variabilei tablou. Declaraia aloc doar suficient spaiu pentru o referin la un tablou (tipic 4 octei), dar
nu creeaz efectiv obiectul tablou.

String[] args; // args este un tablou de String
int[] scores; // scores este un tablou de int
JButton[] bs; // bs este un tablou de JButton

Nu se specific dimensiunea n declaraie. Spre deosebire de alte limbaje, nu se pune niciodat
dimensiunea tabloului n declaraie, deoarece o declaraie de tablou specific doar tipul elementelor i
numele variabilei.

Alocai obiectul tablou cu new. Un tablou se creeaz cu new. Exemplul urmtor creeaz un tablou de
100 elemente de tipul int, de la a[0] la a[99].

int[] a; // Declara a ca fiind un tablou de int
a = new int[100]; // Aloca un tablou de 100 int

Acestea sunt adesea combinate ntr-o singur linie.

int[] a = new int[100]; // Declara si aloca.

Indici
Indicii sunt inclui ntre paranteze ptrate []. x
i
din matematica este x[i] n Java.
Gamele pentru indici ncep ntotdeauna la zero deoarece Java provine n mare parte din C++, limbaj care
avea un motiv bun pentru folosirea lui zero (aritmetica cu poanteri pe tablouri). Nu este modul n care
numra de obicei oamenii, dar asta e.
Java verific ntotdeauna legalitatea indicilor pentru a se asigura ca indicele este >= 0 i mai mic dect
numrul de elemente din tablou. Dac indicele este n afara acestei game, Java arunca o excepie de tipul
ArrayIndexOutOfBoundsException. Acest comportament este net superior celui din C i C++, limbaje care
permit referine n afara gamei corecte. n consecin, programele Java sunt mult mai puin susceptibile
la erori i carene de securitate dect programele C/C++.

Lungimea unui tablou
Fiecare tablou are o variabil instan constant (final) care conine lungimea tabloului. Putei afla cte
elemente poate pstra un tablou scriindu-i numele urmat de .length. n exemplul anterior, a.length ar
fi 100. inei minte c acesta este numrul de elemente din tablou, cu unul mai mult dect indicele
maxim.

Idiomul Java pentru ciclarea peste un tablou
Cea mai frecvent folosire a lui .length se regsete condiia de testat n buclele for. Spre exemplu, n
fragmentul de cod urmtor variabila i va traversa ntreaga gam de indici a tabloului a.

for (int i=0; i < a.length; i++) {
M. Joldo ndrumtor de laborator 5. Clase, obiecte i tablouri
U.T. Cluj-Napoca Programare orientat pe obiecte 3
. . .
}

Dac avei nevoie doar s referii valoarea fiecrui element, putei folosi bucla oarecum mai simpl din
Java 5, care ine evidena indicelui i atribuie valori succesive unei variabile (v n acest exemplu).

for (int v : a)
{
. . .
}

Exemplu, versiunea 1 Adunarea elementelor unui tablou

Fragmentul urmtor creeaz un tablou i pun 1000 de valori aleatoare n el. Cea de a doua bucl adun
toate cele 1000 elemente. Ar fi fost mai bine s le adugm n prima bucl, dar prin aceast scriere avem
dou exemple de bucle.

int[] a; // Declar un tablou de int
a = new int[1000]; // Creaz un tablou de 1000 int.

//... Atribuie valori aleatoare fiecarui element.
for (int i=0; i < a.length; i++)
{
a[i] = (int)(Math.random() * 100000); // Numarul aleatoriu in gama 0-99999
}

//... Aduna toate valorile din tablou.
int sum = 0; // Initializeaza suma totala la 0.
for (int i=0; i<a.length; i++)
{
sum = sum + a[i]; // Aduna urmatorul element la total
}

Exemplu, versiunea 2 Adunarea tuturor elementelor unui tablou n Java 5

Este la fel ca cel de mai sus, dar folosete bucla for each din Java 5 pentru a face nsumarea, lucru care
ne elibereaz de folosirea unui indice, dac ceea ce avem nevoie este s obinem toate valorile succesive.
Acest fel de bucl doar ne obine valorile, aa c nu poate fi folosit pentru a stoca valorile n prima bucl
de mai sus.

. . .
int sum = 0; // Initializeaza suma totala la 0.
for (int v : a)
{
sum = sum + v; // Aduna urmatorul element la total
}

Valori iniiale pentru elementele de tablou zero/null/false

La alocarea unui tablou (cu new), toate elementele primesc o valoare iniial. Aceast valoare este 0 dac
tipul este numeric (int, float, ...), false pentru boolean i null pentru toate tipurile de obiecte.
M. Joldo ndrumtor de laborator 5. Clase, obiecte i tablouri
U.T. Cluj-Napoca Programare orientat pe obiecte 4

2.2 Iniializarea tablourilor

La declararea unui tablou, putei i s alocai un obiect tablou preiniializat n aceeai instruciune. n
acest caz, nu furnizai mrimea tabloului fiindc Java numr valorile din iniializare pentru a determina
mrimea. Spre exemplu,

// stil Java 1.0 mai scurt, dar poate fi folosit DOAR IN DECLARATII
String[] days = {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"};

Variabilele tablou sunt referite la tablouri

La declararea unei variabile tablou, Java rezerv memorie suficient doar pentru o referin (numele Java
pentru adresa sau poanter) la un obiect tablou. Referinele necesit n mod tipic doar 4 octei. La crearea
unui obiect tablou cu new se returneaz o referin, iar acea referin poate fi asignat unei variabile. La
asignarea unui tablou la un altul, doar referina este copiat. Spre exemplu:

int[] a = new int[] {100, 99, 98};
int[] b;
// "a" poanteaza spre un tablou, iar "b" nu poanteaza spre nimic
b = a; // Acum b se refera la ACELASI tablou ca si "a"
b[1] = 0; // Schimba si a[1] deoarece a si se se refera la acelasi tablou.
// Att a ct si b se refera la acelasi tablou cu valorile {100, 0, 98}


2.3 Noiuni mai complicate

Tablouri anonime
Java 2 a adugat tablourile anonime, care v permit s creai un tablou de valori nou oriunde n program,
nu doar ntr-o iniializare ntr-o declaraie.

// Acest stil anonim de tablou poate fi folosit si in alte instructiuni.
String[] days = new String[] {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"};

Sintaxa tablourilor anonime poate fi folosit i n alte pri ale programului. Spre exemplu:

// In afara declaratiei puteti face aceasta atribuire.
x = new String[] {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"};

Trebuie s avei grij s nu creai aceste tablouri anonime n bucle sau ca variabile locale, deoarece
fiecare folosire a lui new va crea un alt tablou.

Alocarea dinamic
Deoarece tablourile sunt alocate dinamic, valorile de iniializare pot fi expresii arbitrare. Spre exemplu,
apelul urmtor creeaz dou tablouri noi pe care le transmite ca parametri lui drawPolygon.

g.drawPolygon(new int[] {n, n+45, 188}, new int[] {y/2, y*2, y}, 3);

Declaraii de tablouri n stil C
Java v permite i s scriei parantezele ptrate dup numele variabilei n loc s le scriei dup tip. Acesta
este modul n care se scriu declaraiile de tablouri n C, dar nu constituie un stil bun pentru Java. Sintaxa
C poate arata foarte urt avnd o parte a declaraiei nainte de variabil i o parte dup. Java are un stil
mult mai curat, n care toat informaia de tip poate fi scris fr a folosi o variabil. Sunt situaii n care
acest stil Java este singura notaie care se poate folosi.

M. Joldo ndrumtor de laborator 5. Clase, obiecte i tablouri
U.T. Cluj-Napoca Programare orientat pe obiecte 5
int[] a; // stil Java -- bun
int a[]; // stil C -- legal, dar nerecomandat

2.4 Probleme frecvente la tablouri

Cteva probleme frecvent ntlnite la folosirea tablourilor sunt:
Se uita c indicii ncep de la zero.
Se scrie a.length() n loc de a.length. Metoda length() este folosit la String, nu la tablouri.
Declararea unui tablou cu mrime. D.e., int[100] a; n loc de int[] a = new int[100];

2.5 Metode de bibliotec pentru tablouri

Exist metode de bibliotec, statice pentru manipularea tablourilor n clasa java.util.Arrays.
Arrays.asList() Returneaz un List (list) pe baza tabloului.
Arrays.toString() Returneaz o form citibil a tabloului.
Arrays.binarySearch() Execut o cutare binar pe un tablou sortat.
Arrays.equals Compar dou tablouri dac sunt egale..
Arrays.fill() Umple tot tabloul sau o subgam cu o valoare.
Arrays.sort() Sorteaz un tablou.

n plus, exist metoda System.arrayCopy().

Inversarea unui tablou

Aceast versiune a inversrii folosete doi indici: unul care ncepe la stnga (nceputul) tabloului i un
altul care ncepe la dreapta (sfritul) tabloului. Se poate folosi i o bucl care merge spre mijlocul
tabloului.

//========================================================= reverse
public static void inverseaza(int[] b)
{
int stinga = 0; // indexul elementului celui mai din stnga
int dreapta = b.length-1; // indexul elementului celui mai din dreapta

while (stinga < dreapta)
{
// interchimba elementele din stinga si dreapta
int temp = b[stinga];
b[stinga] = b[dreapta];
b[dreapta] = temp;

// deplaseaza limitele spre centru
stinga++;
dreapta--;
}
}//sfrsit metoda inverseaza

O bucl for care s mearg spre mijloc ar nlocui cele 8 instruciuni de mai sus cu ceea ce urmeaz.
Ambele bucle sunt la fel de rapide, aa c alegei-o pe cea care vi se pare mai de neles.

for (int stinga=0, int dreapta=b.length-1; stinga<dreapta; stinga++, dreapta--) {
// interchimba primul cu ultimul
int temp = b[stinga]; b[stinga] = b[dreapta]; b[dreapta] = temp;
}

M. Joldo ndrumtor de laborator 5. Clase, obiecte i tablouri
U.T. Cluj-Napoca Programare orientat pe obiecte 6
2.6 Tablouri multidimensionale

Tablourile din Java sunt de fapt tablouri liniare, unidimensionale. Cu toate acestea, se pot construi
tablouri cu mai multe dimensiuni, ntruct exista posibiliti de creare a lor.

Exemplele care urmeaz folosesc toate tablouri bidimensionale, dar sintaxa i codificarea se poate extinde
pentru oricte dimensiuni. Prin convenie, tablourile bidimensionale au linii (orizontale) i coloane
(verticale). Primul indice selecteaz linia (care este un tablou monodimensional n sine), iar cel de-al
doilea selecteaz elementul n acea linie/acel tablou.

Vizualizarea tablourilor bidimensionale

S presupunem ca avem un tablou, a, cu trei linii i patru coloane.

a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
Tablourile bidimensionale sunt vizualizate de obicei matrice, cu linii i coloane. Diagrama urmtoare arat
un tablou cu indicii corespunztori.

+-----+
| | +-----+-----+-----+-----+
|a[0] | -> | [0] | [1] | [2] | [3] |
| | +-----+-----+-----+-----+
+-----+
| | +-----+-----+-----+-----+
|a[1] | -> | [0] | [1] | [2] | [3] |
| | +-----+-----+-----+-----+
+-----+
| | +-----+-----+-----+-----+
|a[2] | -> | [0] | [1] | [2] | [3] |
| | +-----+-----+-----+-----+
+-----+
n Java tablourile bidimensionale sunt implementate ca tablou monodimensional de tablouri
monodimensionale.

Declararea i alocarea unui tablou bidimensional

De exemplu, tabla pentru tic-tac-toe. Va avea (ntr-un caz foarte limitat) trei rnduri primul indice i trei
coloane al doilea indice i va conine un int n fiecare element.

int[][] board = new int[3][3];


Valori iniiale

Se pot asigna valori iniiale tabloului la declararea ntr-un mod foarte asemntor cu cel pentru tablourile
monodimensionale. Dimensiunile sunt calculate din numrul de valori.

int[][] board = new int[][] {{0,0,0},{0,0,0},{0,0,0}};

Trebuie s dai o valoare unui element nainte de a-l folosi, fie printr-o iniializarea, fie printr-o asignare.

Exemplu desenarea tablei de tic-tac-toe

M. Joldo ndrumtor de laborator 5. Clase, obiecte i tablouri
U.T. Cluj-Napoca Programare orientat pe obiecte 7
Adesea este cel mai uore s se foloseasc tablourile bidimensionale cu bucle for imbricate. Spre
exemplu, codul care urmeaz deseneaz tabla de tic-tac-toe printr-o metod paint. Codul presupune c o
celul are latura de 10 pixeli i c un numr pozitiv nseamn un X, iar unul negativ reprezint un O.

for (int row=0; row<3; row++)
{
for (int col=0; col<3; col++)
{
if (board[row][col] > 0) { // deseneaza X
g.drawLine(col*10, row*10 , col*10+8, row*10+8);
g.drawLine(col*10, row*10+8, col*10+8, row*10 );
}
else if (board[row][col] < 0)
{ // deseneaza O
g.drawOval(col*10, row*10, 8, 8);
}
}
}

3 Mersul lucrrii

1.1. Studiai i nelegei textul i exemplele date.

1.2. Definii o clas Matrice care s implementeze operaiile de adunare, scdere, nmulire de matrice,
precum i mprirea cu un scalar.

1.3. Implementai o clas TablaSah care s pstreze poziii pe tabla de ah. Figurile i pionii sunt i ei
clase. Verificai corectitudinea mutrilor.