Sunteți pe pagina 1din 15

Disciplina: Metode avansate de programare

Cadru didactic: Ralf Fabian


Specializarea: Informatică, anul II.

Elemente de limbaj

1. CARACTERISTICI ALE LIMBAJULUI JAVA


2. PLATFORMA DE LUCRU JAVA
3. LEXICUL LIMBAJULUI JAVA
3.1 SETUL DE CARACTERE
3.2 CUVINTE CHEIE REZERVATE
3.3 LITERALI
3.4 SEPARATORI
3.5 IDENTIFICATORI
3.6 COMENTARII
3.7 OPERATORI
4. TIPURI DE DATE
5. VARIABILE
6. CONTROLUL EXECUŢIEI
6.1 INSTRUCŢIUNI DE DECIZIE
6.2 INSTRUCŢIUNI DE SALT
6.3 ALTE INSTRUCŢIUNI
7. VECTORI
7.1 CREAREA UNUI VECTOR
7.2 DIMENSIUNE, VALORI IMPLICITE, INDEXARE
7.3 VECTORI MULTIDIMENSIONALI SAU VECTOR DE VECTOR
7.4 COPIEREA VECTORILOR
7.5 VECTORI CU DIMENSIUNE VARIABILA
7.7 CLASA ARRAYS
PACHETE DE BAZĂ
TEME

Java ca limbaj şi mediu de programare a fost lansat şi este în continuare susţinut de firma
Sun Microsystems. Cea mai mare parte a sintaxei de programare Java este moştenita de la C++, dar
unele din conceptele de programare obiectuală prezente în Java îţi au rădăcinile în limbajele
SmallTalk şi Lisp.

1. Caracteristici ale limbajului Java


Limbajul Java are câteva caracteristici care îl fac un limbaj de succes pe piaţa actuala de
software:
 Simplitate – elimina supraîncărcarea operatorilor, moştenirea multiplă şi toate ”facilităţile”
ce pot provoca scrierea unui cod confuz.
 Uşurinţa – în crearea de aplicaţii complexe ce folosesc programarea în reţea, fire de
execuţie, interfaţă grafică, baze de date, etc.

1
 Robusteţe – elimină sursele frecvente de erori ce apar în programare prin renunţarea la
pointeri, administrarea automată a memoriei şi eliminarea pierderilor de memorie printr-o
procedură de colectare a obiectelor care nu mai sunt referite, ce rulează în fundal (”garbage
collector”).
 Complet orientat pe obiecte – elimină complet stilul de programare procedural.
 Securitate – este un limbaj de programare foarte sigur, furnizând mecanisme stricte de
securitate a programelor concretizate prin: verificarea dinamică a codului pentru detectarea
secvenţelor periculoase, impunerea unor reguli stricte pentru rularea proceselor la distanţă,
etc.
 Neutralitate arhitecturală – comportamentul unei aplicaţii Java nu depinde de arhitectura
fizică a maşinii pe care rulează.
 Portabililtate – Java este un limbaj independent de platforma de lucru, aceeaşi aplicaţie
rulând fără nici o modificare şi fără a necesita recompilarea ei pe sisteme de operare diferite
cum ar fi indows, Linux, Mac OS, Solaris, etc. lucru care aduce economii substanţiale
firmelor dezvoltatoare de aplicaţii.
 Este compilat şi interpretat – aceasta fiind soluţia eficientă pentru obţinerea portabilităţii.
 Performanţă – deşi mai lent decât limbajele de programare care generează executabile
native pentru o anumită platformă de lucru, compilatorul Java asigură o performanţă ridicată
a codului de octeţi, astfel încât viteza de lucru puţin mai scăzută nu va fi un impediment în
dezvoltarea de aplicaţii oricât de complexe, inclusiv grafică 3D, animaţie, etc.
 Este modelat după C şi C++, trecerea de la C, C++ la Java făcându-se foarte uşor.

2. Platforma de lucru Java


Limbajul de programare Java a fost folosit la dezvoltarea unor tehnologii dedicate rezolvării unor
probleme din cele mai diverse domenii. Aceste tehnologii au fost grupate în aşa numitele platforme
de lucru, ce reprezintă seturi de librării scrise în limbajul Java, precum şi diverse programe utilitare,
folosite pentru dezvoltarea de aplicaţii sau componente destinate unei anume categorii de utilizatori.

J2SE (Standard Edition)


Este platforma standard de lucru ce oferă suport pentru crearea de aplicaţii independente şi
appleturi. De asemenea, aici este inclusă şi tehnologia JavaWeb Start ce furnizează o modalitate
extrem de facilă pentru lansarea şi instalarea locală a programelor scrise în Java direct de pe Web,
oferind cea mai comodă soluţie pentru distribuţia şi actualizarea aplicaţiilor Java.

J2ME (Micro Edition)


Folosind Java, programarea dispozitivelor mobile este extrem de simplă, platforma de lucru
J2ME oferind suportul necesar scrierii de programe dedicate acestui scop.

J2EE (Enterprise Edition)


Această platformă oferă API-ul necesar dezvoltării de aplicaţii complexe, formate din
componente ce trebuie să ruleze în sisteme eterogene, cu informaţiile memorate în baze de date
distribuite, etc. Tot aici găsim şi suportul necesar pentru crearea de aplicaţii şi servicii Web, bazate
pe componente cum ar fi servleturi, pagini JSP, etc.

3. Lexicul limbajului Java


3.1 Setul de caractere
Limbajului Java lucrează în mod nativ folosind setul de caractere Unicode. Acesta este un
standard internaţional care înlocuieşte vechiul set de caractere ASCII şi care foloseşte pentru

2
reprezentarea caracterelor 2 octeţi, ceea ce înseamnă că se pot reprezenta 65536 de semne, spre
deosebire de ASCII, unde era posibilă reprezentarea a doar 256 de caractere. Primele 256 caractere
Unicode corespund celor ASCII, referirea la celelalte făcându-se prin \uxxxx, unde xxxx reprezintă
codul caracterului.
O altă caracteristică a setului de caractere Unicode este faptul că întreg intervalul de
reprezentare a simbolurilor este divizat în subintervale numite blocuri, câteva exemple de blocuri
fiind: Basic Latin, Greek, Arabic, Gothic, Currency, Mathematical, Arrows, Musical, etc.

 \u0030 - \u0039 : cifre ISO-Latin 0 - 9


 \u03B1 - \u03C9 : simboluri greceşti
 \u2200 - \u22FF : simboluri matematice
 \u4e00 - \u9fff : litere din alfabetul Han

3.2 Cuvinte cheie rezervate


O serie de cuvintele nu pot fi folosite ca identificatori în Java, întrucât ele sunt tratate diferit
de compilator. Aceste cuvinte se numesc cuvinte cheie rezervate şi desemnează „limbajului” unui
compilator. Cu mici excepţii, cuvintele rezervate din Java sunt cele din C++.
Tabelul de mai jos conţine toate cuvintele cheie rezervate. Cele marcate cu (*) sunt
rezervate dar şi folosite de limbaj. Cuvintele true, false şi null sunt consideraţi literali şi de
asemenea, nu pot fi folosite drept identificatori.

abstract continue for new switch


assert default goto * package synchronized
boolean do if private this
break double implements protected throw
byte else import public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const * float native super while
Tabelul 1. Cuvintele rezervate ale limbajului Java.

3.3 Literali
Literalii reprezintă valori constante de diferite tipuri de date primitive (întreg, caracter etc).
Întregi
Sunt acceptate 3 baze de numeraţie : baza 10, baza 16 (încep cu caracterele 0x) şi baza 8
(încep cu cifra 0) şi pot fi de două tipuri:
– normali - se reprezintă pe 4 octeţi (32 biţi)
– lungi - se reprezintă pe 8 octeţi (64 biţi) şi se termină cu caracterul L (sau l).
Flotanţi
Pentru ca un literal să fie considerat flotant el trebuie să aibă cel puţin o zecimală după
virgulă, să fie în notaţie exponenţială sau să aibă sufixul F sau f pentru valorile normale -
reprezentate pe 32 biţi, respectiv D sau d pentru valorile duble - reprezentate pe 64 biţi.
Exemple: 1.0, 2e2, 3f, 4D.
Logici
Sunt reprezentaţi de true - valoarea logică de adevăr, respectiv false
– valoarea logică de fals.
Caracter
Un literal de tip caracter este utilizat pentru a exprima caracterele codului Unicode.
Reprezentarea se face fie folosind o literă, fie o secvenţă escape scrisă între apostrofuri.
Secvenţele escape permit specificarea caracterelor care nu au reprezentare grafică şi

3
reprezentarea unor caractere speciale precum backslash, apostrof, etc. Secvenţele escape
predefinite în Java sunt:
– ’\b’ : Backspace (BS)
– ’\t’ : Tab orizontal (HT)
– ’\n’ : Linie nouă (LF)
– ’\f’ : Pagină nouă (FF)
– ’\r’ : Inceput de rând (CR)
– ’\"’ : Ghilimele
– ’\’’ : Apostrof
– ’\\’ : Backslash

3.4 Separatori
Un separator este un caracter care indică sfârşitul unei unităţi lexicale şi începutul alteia. In
Java separatorii sunt următorii: ( ) [ ] ; , . .
Instrucţiunile unui program se separă cu punct şi virgulă.

3.5 Identificatori
Identificatorii sunt şiruri de caractere (litere sau cifre Java) şi reprezintă numele dat unei
variabile, clase sau funcţii. Ca identificator poate fi folosit orice şir de caractere ce satisface
condiţiile:
- şirul începe cu o literă Java şi nu cu o cifră Java
- şirul este diferit de orice cuvânt cheie
- şirul este diferit de null, false, true
Nu toate caractere Unicode sunt litere sau cifre Java. Pe lângă caracterele din alfabetul latin
(majuscule de la A-Z între \u0041-\u005a, litere mici de la a-z între \u0061-\u007a şi cifrele 0-9
între \u0030-\u0039) pot fi utilizate şi alte caractere Unicode cu condiţia ca funcţia
isJavaLetter(char ch) din clasa Character returnează valoarea true.
Doi identificatori sunt identici dacă şi numai dacă conţin exact aceleaşi caractere în aceeaşi ordine.
Java deosebeşte literele mari de cele mici, deci este case sensitive.
Convenţii recomandate:
- identificatorii numelor de clasă încep cu majusculă, fiecare cuvânt distinct din identificator
începe cu majusculă;
Exemplu: ClassMan, ClassWoman;
- Identificatorii de variabilă încep cu literă mică, fiecare cuvânt ce urmează începe cu
majusculă;
Exemplu: obiectStudent1, obiectStudent2;
- identificatorii unei funcţii respectă regula de la variabile;
Exemplu: deseneazaCerc();
- identificatorii unei constante conţin doar majuscule, cuvintele fiind separate prin underscore
„_”.
Exemplu: NUMAR_MAXIM.

Exemple:
final double PI = 3.14;
final int MINIM=0, MAXIM = 10;
int valoare = 100;
char c1=’j’, c2=’a’, c3=’v’, c4=’a’;
long numarElemente = 12345678L;
String bauturaMeaPreferata = "apa";

4
3.6 Comentarii
Programarea nu înseamnă doar exprimarea corectă a unui algoritm într-un anumit limbaj de
programare ci şi exprimarea gândurilor într-o formă inteligibilă. Asta se poate realiza printr-o
alegere adecvată a denumirilor folosite pentru clase, metode şi variabile. Pentru cazuri în care
aceasta nu este suficient, trebuie să existe posibilitatea de a lasă în codul sursă un text explicativ
care să documenteze alegerile făcute de programator la momentul elaborării algoritmului.
Informaţiile astfel păstrate îşi pot demonstra utilitatea în cazul modificaţii sau reutilizării codului de
către o altă persoana sau chiar şi de programatorul însuşi. Ca urmare, comentariile oferă
posibilitatea documentării programului în vederea unei mai uşoare înţelegeri.

În Java există trei modalităţi de formulare a comentariilor:


– Comentariul de linie – textul care urmează după // până la capătul drept al liniei, va fi
ignorat de compilator.
– Comentariul de bloc – text cuprins între /* şi */ este ignorat de compilator. În interiorul
blocului comentat nu are voie să apară secvenţa */, întrucât ea închide blocul de
comentariu. Comentarii în interiorul comentariilor nu sunt acceptate.
– Comentariul de documentare JavaDoc – reprezintă un comentariu special, cuprins între
/** şi */, şi are aceleaşi proprietăţi ca şi comentariul de bloc dar în plus este utilizat
pentru documentarea programului folosind utilitarul javadoc, care generează
documentaţia în format html. Aceste blocuri îşi au de regulă locul înainte de clase,
metode şi membrii, pentru a permite generarea automată a documentaţie acestora.

3.7 Operatori

 atribuirea: =
 operatori matematici: +, -, *, /, %, --, ++
Este permisa notaţia prescurtata de forma lval op= rval (ex: n += 2)
Exista operatorii pentru autoincrementare şi autodecrementare (post şi pre)
ex: x++, ++x, n--, --n
 operatori logici: &&(and), ||(or), !(not)
 operatori relaţionali: <, <=, >, <=, ==, !=
 operatori pe biţi: & (and), |(or), ^(xor), ~(not)
 operatori de translaţie <<, >>, >>> (shift la dreapta fara semn)
Operanzii trebuie să fie de un tip întreg, în general int sau long.
 Operatorul << deplasează spre stânga şi biţi de 0 sunt introduşi pe poziţiile cele mai
puţin semnificative. Deplasarea spre stânga cu o poziţie corespunde dublării
operandul stâng, deplasarea spre stânga cu mai mult de o poziţie corespunde
înmulţirii operandului stâng cu 2,4,8,16, ş.a.m.d.
 Operatorul >> efectuează o deplasare cu semn (sau aritmetică) spre dreapta.
Rezultatul are biţi de 0 pe cele mai semnificative poziţii dacă operandul stâng este
pozitiv, şi biţi de 1 pe cele mai semnificative poziţii dacă operandul stâng este
negativ. Rezultatul aproximează împărţirea operandului stâng la 2 ridicat la puterea
operandului drept.
 Operatorul >>> efectuează o deplasare fără semn (sau logică) spre dreapta.
Rezultatul are biţi de 0 pe cele mai semnificative poziţii şi poate să nu reprezinte
întotdeauna o divizare a operandului stâng.
 operatorul if-else: expresie_logica ? val_pt_true : val_pt_false ;
 operatorul , (virgula) folosit pentru evaluarea secvenţiala a operaţiilor int x=0, y=1, z=2;
 operatorul + pentru concatenarea şirurilor:

5
String s="abcd"
int x=100;
System.out.println(s + " - " + x);
 operatori pentru conversii (cast) : (tip_de_data)
int i = 200;
long l = (long)i; //widening conversion - conversie prin extensie
long l2 = (long)200;
int i2 = (int)l2; //narrowing conversion - conversie prin contracţie
 operatorul instanceof testează dacă un obiect este de o anumită clasă
boolean test;
Class1 obj1;
Class2 obj2;
test=obj2 instanceof Class1 //test va fi false

4. Tipuri de date
Tipurile de date din Java se clasifica în doua categorii:

a. Tipuri de date primitive – reprezintă acele date care sunt incluse implicit în limbajul Java.
Sunt tipuri numerice întregi (byte, short, int, long, char), tipuri numerice reale (float, double)
şi tipul boolean (boolean).

Tip Lungime în bytes Valori


boolean 1 true sau false
char 2 16-bit Unicode (0x0000...0xffff)
byte 1 -2^7 bis 2^7 – 1 (-128...127)
short 2 -2^15 bis 2^15 – 1 (-32768...32767)
int 4 -2^31 bis 2^31 – 1 (-2147483648...2147483647)
long 8 -2^63 bis 2^63 – 1
(-9223372036854775808...9223372036854775807)
float 4 1.40239846E-45f… 3.40282347E+38f
double 8 4.94065645841246544E-324... 1.79769131486231570E+308

În alte limbaje de programare formatul şi dimensiunea tipurilor primitive de date pot


depinde de platforma pe care rulează programul. In Java acest lucru nu mai este valabil, orice
dependenţă de o anumită platformă specifică fiind eliminată.

b. Tipuri de date referinţă – sunt clasele, tablourile şi interfeţele. Ca şi în limbajul C++,


clasele reprezintă tipuri generice de date caracterizate printr-o stare definită de atributele
clasei şi printr-o funcţionalitate definită de metodele clasei; tablourile sunt colecţii de date
de acelaşi tip, iar interfeţele sunt un fel de clase abstracte.

Variabilele de tip primitiv se pot crea numai prin declarare.

6
Variabilele de tip referinţă se pot crea cu operatorul new care (spre deosebire de C++)
returneaza o referinţă.
O referinţă Java este un identificator al unui obiect şi este, de fapt un pointer ascuns,
asemănător cu o referinţă C++, de care se deosebeşte în primul rând din punct de vedere sintactic
(nu se mai foloseşte operatorul & la definiţia unei referinţe).
Deoarece nu se pot defini referinţe pentru tipurile primitive, în pachetul java.lang sunt
definite mai multe clase care “înfăşoară” tipurile primitive, adică au ca data membru o variabila de
tipul primitiv respectiv. Aceste clase sunt Byte, Short, Integer, Character, Float, Double
etc. Majoritatea acestor clase (cu excepţia claselor Integer şi Character) au aceeaşi denumire ca şi
tipul de date primitive corespunzător, cu primul caracter modificat în majusculă.

class Numar{
int n;
Numar(int x){n=x;}
}
public class Tipuri{
public static void main(String[] args) {
int x = 10;
Integer i1 = new Integer(100);
Byte b1 = new Byte((byte)20);
Character c1 = new Character('A');
Numar n1 = new Numar(7);
System.out.println("int: " + x);
System.out.println("Integer: " + i1);
System.out.println("Byte: " + b1);
System.out.println("Character: " + c1);
System.out.println("Numar: " + n1.n);
}
}
Output:
int: 10
Integer: 100
Byte: 20
Character: A
Numar: 7

5. Variabile
Variabilele pot fi de tip primitiv sau referinţă. Indiferent de tipul lor, pentru a putea fi
folosite variabilele trebuie declarate şi, eventual, iniţializate.
 Declararea variabilelor: Tip numeVariabila;
 Iniţializarea variabilelor: Tip numeVariabila = valoare;
 Declararea constantelor: final Tip numeVariabila;
Există posibilitatea de a declara şi iniţializa mai multe variabile sau constante de acelaşi tip într-o
singură instrucţiune astfel:

Tip variabila1[=valoare1], variabila2[=valoare2],...;

În funcţie de locul în care sunt declarate variabilele, se împart în următoarele categorii:


a. Variabile membre, declarate în interiorul unei clase, vizibile pentru toate metodele clasei
respective cât şi pentru alte clase în funcţie de nivelul lor de acces.
b. Parametri metodelor, vizibili doar în metoda respectivă.
c. Variabile locale, declarate într-o metodă, vizibile doar în metoda respectivă.
d. Variabile locale, declarate într-un bloc de cod, vizibile doar în blocul respectiv.

7
 Variabilele declarate într-un for, rămân locale corpului ciclului:

for(int i=0; i<100; i++) {


//domeniul de vizibilitate al lui i
}
i = 101;//incorect

 Nu este permisă ascunderea unei variabile:

int x=1;
{
int x=2; //incorect
}

6. Controlul execuţiei
6.1 Instrucţiuni de decizie
if-else

if (expresie-logica) {
...
}

if (expresie-logica) {
...
} else {
...
}

switch-case

switch (variabila) {
case valoare1:
...
break;
case valoare2:
...
break;
...
default:
...
}

6.2 Instrucţiuni de salt

for

for(initializare; expresie-logica; pas-iteratie) {


//Corpul buclei
}
for(int i=0, j=100 ; i < 100 && j > 0; i++, j--) {
...
}

foreach
Este o variantă de for specializat pe parcurgerea secvenţială de vectori fără a folosi o variabilă de
index. Se poate citi ca „pentru fiecare element execută”. Variabila element trebuie să fie de acelaşi
tip ca vectorul.
8
for (Tip_element element: nume_vector) {
// procesare element
}

Atât la iniţializare cât şi în pasul de iteraţie pot fi mai multe instrucţiuni despărţite prin virgulă.

while

while (expresie-logica) {
...
}

do-while
do {
...
}
while (expresie-logica);

6.3 Alte instrucţiuni


 break: părăseşte forţat corpul unei structuri repetitive.
 continue: termina forţat iteraţia curentă a unui ciclu şi trece la următoarea iteraţie.
 return [valoare]: termină o metodă şi, eventual, returnează o valorare.
 numeEticheta: : Defineşte o etichetă.

Deşi în Java nu există goto, se pot defini totuşi etichete folosite în expresii de genul:
break numeEticheata
sau
continue numeEticheta,
utile pentru a controla punctul de ieşire dintr-o structură repetitivă.

i=0;
eticheta:
while (i < 10) {
System.out.println("i="+i);
j=0;
while (j < 10) {
j++;
if (j==5) continue eticheta;
if (j==7) break eticheta;
System.out.println("j="+j);
}
i++;
}

7. Vectori
Un vector este folosit pentru a stoca o colecţie de date, sau altfel spus, o colecţie de variabile
de acelaşi tip. În loc de a declara variabile individuale numarul1, numarul2, până la numarul1000,
declaram un vector numit numere de dimensiune 1000 şi referim elementele prin numere[1],
numere[2], până la numere[1000].
Elementele dintr-un vector trebuie sa fie de acelaşi tip, care poate fi primitiv sau referinţă.
Tablourile de date primitive conţin chiar acele date memorate în elementele tabloului,

9
Vectorii de date primitive conţin în elementele lor valorile efective ale datelor primitive.
Vectorii de referinţe conţin în elementele lor, adrese de memorie (referinţe) spre zonele de memorie
unde se află obiectele stocate.
Identificatorul oricărui vector reprezintă o referinţă la locaţia de memorie unde se găseşte
întregul set de elemente.

În Java, orice vector este un obiect care conţine, în afara elementelor de tabloului, şi un
atribut public (variabilă membru) numit length. Aceasta reţine dimensiunea vectorului şi poate fi
doar citit nu şi scris.

7.1 Crearea unui vector


a) Declarare
Pentru a putea folosi un vector într-un program, trebuie declarată o variabilă care să-l
referenţieze şi de asemenea trebuie specificat tipul vectorului. Sintaxa generală de declarare este:

Tip[] numeVector; // Acest stil este preferat


//sau
Tip numeVector[]; // Acest stil este acceptat, dar nu preferat. El
// provine din limbajul C/C++ şi a fost preluat
// de Java.

Ex:
int[] lista; // Declarare de vector cu elemente întregi.
String[] adrese; // Declarare vector cu elemente de tip referinţă.

După declararea unui vector se creează o variabilă referinţă de valoare null, adică nu referă nici o
zonă de memorie. Aşadar, la declararea unui vector nu se aloca spaţiu pentru elementele tabloului,
indiferent de dimensiune. Se creează doar un spaţiu de stocare pentru o referinţă la un vector.

b) Instanţierea
Spre deosebire de declararea variabilelor de tip primitiv, declararea unui vector nu implică
alocă de spaţiul de memorie.
După declararea unui vector, acesta poate fi creat prin utilizarea operatorului new şi
specificarea numărului maxim de elemente pe care îl va avea vectorul (adică dimensiunea). Ca
sintaxă avem:

numeVector = new Tip[dimensiune];

Ex:
lista = new int[1000]; // Se aloca spaţiu pentru 1000 de întregi.
adrese = new String[100]; // Se aloca spaţiu pentru 10 obiecte de
// tip String.

La instanţiere au loc două lucruri: în primul rând, se creează un vector nou cu operatorul
new, şi în al doilea rând, se asociază unei variabile, referinţa spre zone de memorie nou creată.

Obs: Declararea şi instanţierea unui vector pot fi combinată, obţinându-se:


Tip[] numeVector = new Tip[dimensiune];

Întrucât alocarea memorie se face exclusiv prin operatorul new, următoarea abordare este
incorectă.

10
Ex:
int v[5]; //incorect
int[] v = new int[5]; //corect

c) Iniţializarea
Prin iniţializare asociem elementelor din vector valori iniţiale concrete. Ea este opţională şi poate fi
făcută imediat după declararea unui vector. Alocarea memoriei se face automat în funcţie de
numărul de elemente cu care se iniţializează vectorul. Ca sintaxă avem:

Tip[] numeVector = new Tip {valoare1, valoare2, ..., valoarek};

Ex:
String[] culori = {"Rosu", "Galben", "Verde"};
int[] numere = {9, 4, 2, 302, 5, 7};

Acelaşi rezultat s-ar fi obţinut şi prin următoarele linii de cod:

String[] culori = new String[3];


culori[0] = "Rosu";
culori[1] = "Galben";
culori[2] = "Verde";

7.2 Dimensiune, valori implicite, indexare


Dimensiunile unui vector este fixă şi nu poate fi modificată după instanţiere. Ea este aflată
din atributul length. Pentru exemplul anterior avem:

int lungime = culori.length; // Variabila lungime va primi valoarea 3.

Obs: lenght este proprietate nu metodă.

Daca valoarea indexului nu este pozitiva sau depăşeşte dimensiunea vectorului, în cursul
execuţiei se va “arunca” o excepţie java.lang.ArrayIndexOutOfBoundsException.

Valorile implicite pentru vectorii de date primitive sunt: 0 la tipuri numerice, \u0000 la tipul
char şi false la tipul boolean. În cazul vectorilor de tip referinţă, elementele sunt implicit
iniţializate cu valoarea null.

În Java vectorii sunt indexaţi după valori numerice întregi pozitive începând cu 0, pentru
primul element, şi până la lungimea vectorului – 1, pentru ultimul element.
Accesarea elementelor din vector se face prin operatorul de indexare [ ] . Exemple:
int[] numere = {9, 4, 2, 302, 5, 7};
int x = numere[2];
numere[2]= numere[1]+ numere[4];

Pentru parcurgerea de vectori putem folosi un foreach.


int[] numere = {9, 4, 2, 302, 5, 7};

for (int element: numere) {


System.out.println(element);
}

11
La instanţierea vectorilor cu elemente de tip referinţă, adică obiecte, nu este suficientă
simpla alocarea a spaţiului de memorie necesar vectorului, trebuie de asemenea instanţiat şi fiecare
obiect din vector.

Ex.
Integer[] anArray = new Integer[3];

for (int i = 0; i < anArray.length; i++) {


//următoarea instrucţiune dă o eroare de runtime
System.out.println(anArray[i]);
}
Corect este:

Integer[] anArray = {new Integer(0), new Integer(1), new Integer(2)};


for (int i = 0; i < anArray.length; i++) {
System.out.println(anArray[i]);
}

7.3 Vectori multidimensionali sau vector de vector


Un vector bidimensional (matrice) este de fapt un vector unidimensional unde fiecare element este
de fapt un alt vector unidimensional. Ca urmare, putem spune că în Java un vector multidimensional
este un vector de vectori.

Ex: int m[][]; //declararea unei matrici


m = new int[5][10]; //cu 5 linii, 10 coloane
int [][]tab2 = {{2,3,4},
{3,4,5}}; // se declara si se instantiaza
// un tablou bidimensional
int [] tab3[]; //declaratie echivalenta cu int[][] tab3;

Obs: m[0], m[1], ..., m[5] sunt vectori de întregi cu 10 elemente .


int []a = new int[5];
//a.length are valoarea 5
int[][] x = new int[3][4];

x.length // linii - are valoarea 3


x[0].length // coloane - are valoarea 4

7.4 Copierea vectorilor


O metodă eficientă de copiere a datelor dintr-un vector în altul este pusă la dispoziţie clasa System
prin metoda arraycopy. Prototipul metodei este:
public static void arraycopy(Object source, int srcIndex, Object dest,
int destIndex, int length)

12
int x[] = {1, 2, 3, 4};
int y[] = new int[4];
System.arraycopy(x,0,y,0,x.length);

7.5 Vectori cu dimensiune variabila


Implementarea vectorilor cu număr variabil de elemente este oferita de clasa Vector, ArrayList
din pachetul java.util. Un obiect de tip Vector conţine numai elemente de tip Object.

7.7 Clasa Arrays


În pachetul java.util există clasa Arrays care conţine mai multe metode statice care pot fi
apelate pentru operaţii asupra elementelor din tablouri. Câteva dintre aceste metode sunt:

 fill(tip[], val), pentru umplerea unui tablou de date de tipul tip cu valoarea val (de
acelaşi tip dat). Exista mai multe versiuni supraîncarcate, pentru tipuri primitive si pentru
referinţe (la clasa de baza Object): fill(int[] a, int v), fill(Object[] a,
Objectv).
 equals(tip[] a, tip[] v), returneaza true daca cele doua tablouri (de date de acelaşi
tip) au toate elementele egale.
 sort(tip[] a) , sortează elementele vectorului a (care conţine elemente de tipul tip).

În următorul exemplul se creează câteva tablouri de diferite tipuri (boolean, int etc.) care se
iniţializează folosind metoda fill() a clasei Arrays şi se listează. Pentru listarea elementelor
s-au scris câteva metode de conversie supraîncarcate pentru tablouri de elemente de diferite tipuri.
import java.util.*;

class Numar{
int n;
public Numar(int k){ n = k; }
public String toString(){ return "n = " + n;}
}

public class FillingArrays {

public static String toString(boolean[] a) {


StringBuffer result = new StringBuffer("[");
for(int i = 0; i < a.length; i++) {
result.append(a[i]);
if(i < a.length - 1)
result.append(", ");
}
result.append("]");
return result.toString();
}
public static String toString(char[] a) {
StringBuffer result = new StringBuffer("[");

13
for(int i = 0; i < a.length; i++) {
result.append(a[i]);
if(i < a.length - 1)
result.append(", ");
}
result.append("]");
return result.toString();
}
public static String toString(int[] a) {
StringBuffer result = new StringBuffer("[");
for(int i = 0; i < a.length; i++) {
result.append(a[i]);
if(i < a.length - 1)
result.append(", ");
}
result.append("]");
return result.toString();
}
public static String toString(Numar[] a){
StringBuffer result = new StringBuffer("[");
for(int i = 0; i < a.length; i++) {
result.append(a[i]);
if(i < a.length - 1)
result.append(", ");
}
result.append("]");
return result.toString();
}

public static void main(String[] args) {


int size = 6;
boolean[] a1 = new boolean[size];
char[] a2 = new char[size];
int[] a3 = new int[size];
Numar[] a4 = new Numar[size];
Numar n1 = new Numar(7);
Arrays.fill(a1, true);
Arrays.fill(a2, 'A');
Arrays.fill(a3, 10);
Arrays.fill(a4, n1);
System.out.println(toString(a1));
System.out.println(toString(a2));
System.out.println(toString(a3));
System.out.println(toString(a4));
}
}

14
Pachete de bază
java.lang Conţine clase fundamentale pentru Java (ex. Math) şi sunt
disponibile automat in program. Ele nu trebuie importate.
java.io Conţine clase care suportă operaţii de input/output pe fluxuri.
java.nio Conţine clase care suportă noile operaţii de input/output introduse
in JDK1.4 (în special cu fişiere).
java.nio.channels Conţine clase care suportă operaţii de input/output (cele care scriu
şi citesc fişiere)
java.awt Conţine clase care suportă interfaţa grafică java (GUI).
javax.swing Conţine clase care suportă componentele grafice „Swing”. Acestea
nu sunt doar mai flexibile şi uşor de utilizat decât echivalentul
java.awt, ele sunt implementate cu o dependenţă minimală de cod
nativ.
javax.swing.border Clase care suportă generarea de contururi în jurul componentelor
Swing.
javax.swing.event Clase care suportă tratarea de evenimente pentru componentele
Swing.
java.awt.event Clase care suportă tratarea de evenimente.
java.awt.geom Conţine clase pentru desenarea şi lucrul cu entităţi geometrice 2D.
java.applet Conţine clase care permit scrierea de applet-uri (programe integrate
în pagini web).
java.util Conţine clase care suportă o gamă de operaţii standard pentru
managementul colecţiilor de date, accesarea informaţiilor de dată şi
timp, şi analiza şirurilor.

15