Sunteți pe pagina 1din 35

114

Programare obiectuală în Java

Scurt istoric

Java este un limbaj de programare orientat pe obiecte asemănător


limbajului C++. El a fost dezvoltat de firma Sun, prima semnalare a
apariŃiei sale datând din 1991. Limbajul a fost dezvoltat în cadrul unui
proiect denumit Green, obiectivul acestuia fiind dezvoltarea unui limbaj
pentru programarea echipamentelor electronice "inteligente" şi
comunicarea cu acestea. Punctul de pornire a fost limbajul C++, dar Java
aduce acestuia un volum semnificativ de modificări, mai ales în sensul
simplificării, creşterii rigurozităŃii şi a portabilităŃii. Conducătorul
proiectului, Green James Gosling, este considerat părintele limbajului
Java. Noului limbaj i s-a dat la început numele Oak (eng. stejar) dar
acesta a fost revendicat de o altă firmă şi realizatorii l-au schimbat în
Java, aluzie la sursa băuturii favorite a memrilor echipei - cafeaua.

Caracteristicile noului limbaj au intrat însă şi în atenŃia şi firmelor


preocupate de dezvoltarea Internetului. A realiza aplicaŃii având un cod
redus, uşor deci de transportat prin reŃele şi care pot fi rulate pe diferite
tipuri de calculatoare şi de sisteme de operare reprezenta o problemă
dificilă. Dar nu şi pentru echipa care a creat Java, care în 1994 a pus la
punct o aplicaŃie destinată navigării prin Internet (denumită HotJava) care
integra suportul necesar executării în pagina de web a unor mici aplicaŃii,
denumite applet-uri. A mai trebuit un pic de sprijin din partea firmei
Netscape, al cărui program de navigare în Internet era deja larg răspândit
şi succesul imediat al limbajului Java a fost asigurat.
115

Realizarea unei aplicaŃii elementare în Java

Ca şi în cazul programării în C++, dezvoltarea proiectelor


informatice în Java se realizează folosind medii de programare evoluate,
cele mai utilizate fiind Eclipse (http://www.eclipse.org), JDeveloper
(http://www.oracle.com/technology/products/jdev/) sau Netbeans
(www.netbeans.org). Pentru a prezenta noŃiunile fundamentale de
programare obiectuală se recomandă soluŃii mai puŃim sofisticate, un
mediu simplu ca de exemplu BlueJ (www.bluej.org) fiind perfect. Acest
mediu de dezvoltare a fost realizat în Anglia în cadrul UniversităŃii din Kent
în colaborare cu Sun Mycrosystems.

Înainte de instalarea mediului BlueJ trebuie instalată o versiune a


JRE (Java Runtime Environment). De regulă însă cei ce urmează să
dezvolte aplicaŃii în Java îşi instalează JDK (Java Development Kit,
www.sun.com) care cuprinde pe lângă JRE un ansamblu de instrumente
de dezvoltare care vor fi cerute de celelalte medii de dezvoltare
enumerate deja.

După încheierea pregătirii calculatorului se lansează în execuŃie


BlueJ:
116

Pentru a începe introducerea programului se va crea un nou proiect


(Project / New project). Deoarece aplicaŃiile Java sunt de regulă compuse
din mai multe fişiere, indiferent de mediul de programare folosit, crearea
unei aplicaŃii va începe prin realizarea unui nou proiect. În momentul
creerii unui nou proiect aplicaŃia va crea un nou director în care va pune
ulterior toate fişierele proiectului.

În cazul în care trebuie corectat un proiect existent se va selecta


Project / Open Project...

Primului proiect i s-a dat numele "figuri".

Să presupunem că vrem să scriem un program care foloseşte


diferite figuri geometrice printre care şi dreptunghiul. Un dreptunghi este
definit prin lungimile laturilor sale a şi b, valori întregi şi prin coordonatele
x şi y ale punctului în care dreptunghiul va fi desenat.
117

Să presupunem că am realizat cândva un program care conŃine trei


funcŃii, arie(), perim() şi desenez() care realizează calculul ariei,
perimetrului respectiv desenează dreptunghiul. În C++ aplicaŃia scrisă ar
putea fi următoarea:

#include <iostream>
using namespace std;

int arie(int a, int b);


int perim(int a, int b);
void desenez(int a, int b, int x, int y);

void main()
{
int a, b, x, y;
cout << "a= ";
cin >> a;
cout << "b= ";
cin >> b;
cout << "x= ";
cin >> x;
cout << "y= ";
cin >> y;

cout << "Aria dreptunghiului : " << arie(a, b) << endl;


cout << "Perimetrul dreptunghiului : " << perim(a, b) << endl;
}

int arie(int a, int b)


{
return a*b;
}

int perim(int a, int b)


{
return 2*a + 2*b;
}

void desenez()
{
// Se deseneaza dreptunghiul
}

Dacă avem o aplicaŃie care conŃine practic toate prelucrările


necesare ne aflăm în faŃa următoarei probleme: Cum putem să reutilizăm
codul deja scris?

Ar fi foarte bine dacă s-ar putea încorpora integral programul


precedent în noua aplicaŃie. Şi dacă se poate – fără modificări. Apoi, din
118

noua aplicaŃie, ar fi bine să putem apela funcŃiile arie(), perim() sau


desenez() de câte ori este necesar, pe diferite seturi de date. Apare
deci o nouă problemă, respectiv cum putem transmite seturile de date
(valorile pentru a, b, x şi y). În aplicaŃia veche acestea erau introduse de
operator în mod interactiv. În noua aplicaŃie ar fi bine să existe o funcŃie
care să preia setul de date după care s-ar putea apela oricare dintre
funcŃiile care are utilizează datele din set.

Răspunsul la toate aceste întrebări este oferit de o tehnologie nouă


în programare – programarea orientată pe obiecte.

Astfel pentru a încorpora fără modificări o unitate de program


cuprinzând un set de variabile şi funcŃiile destinate exploatării valorilor
setului de variabile, aceasta trebuie declarată ca fiind o clasă. În
programarea obiectuală clasa este o noŃiune fundamentală şi reprezintă
un prototip care defineşte un set de variabilele de stare şi un ansamblu de
funcŃii (metodele clasei) destinate exploatării variabilelor de stare.

DeclaraŃii
Metode (funcŃii) de variabile

Un obiect este o instanŃă a clasei caracterizat prin ansamblul de


valori efective date variabilelor de stare.

Reluând exemplul considerat, pentru a putea reutiliza codul scris


s-ar putea declara clasa dreptunghi. Un dreptunghi având de exemplu
a=30 şi b=20 ar putea fi un obiect aparŃinând clasei dreptunghi sau, altfel
spus, o instanŃă a clasei dreptunghi.

Clasa dreptunghi va trebui să aibă patru variabile de stare de tip int


(a, b, x şi y) şi trei funcŃii (metode): arie(), perim() şi desenez().
119

Deoarece s-a stabilit deja că o clasă ar trebui să conŃină o funcŃie care să


impună valori variabilelor de stare, clasei dreptunghi o să i se adauge o a
patra funcŃie denumită chiar dreptunghi(). În programarea obiectuală o
funcŃie care are rolul de a da valori setului de variabile de stare se
numeşte constructor şi poartă în mod obligatoriu numele clasei.

În continuare se va defini clasa dreptunghi, scrierea codului


realizându-se în Java. În ciuda lipsei oricăror noŃiuni de programare în
Java, asemănarea acestuia cu C / C++ va permite totuşi înŃelegerea
codului scris.

După crearea proiectului figuri va fi apăsat butonul New Class...

În fereastra de definire a numelul noii clase se va introduce numele


clasei – dreptunghi.

Pentru a defini clasa se va selecta cu un dublu clic simbolul


acesteia în fereastra aplicaŃie BlueJ.
120

Mediul de programare va deschide o fereastră de editare în care


clasa dreptunghi apare parŃial definită. Cei care au creat acest mediu de
programare au considerat că pentru un începător în programarea
obiectuală este mai practic să editeze o soluŃie aproximativă decât să scrie
totul de la început.

După corectarea clasei şi înlăturarea comentariilor, definiŃia clasei


dreptunghi va fi următoarea:

public class dreptunghi


{
private int a;
private int b;
private int x;
private int y;

public dreptunghi(int aa, int bb, int xx, int yy)


{
// constructorul clasei
a = aa;
121

b = bb;
x = xx;
y = yy;
}

public int arie()


{
return a * b;
}

public int perim()


{
return 2*a + 2*b;
}

public void desenez()


{
// Se deseneaza dreptunghiul
}
}
Acum, după definirea clasei, se pot creea obiecte (instanŃe) ale
clasei dreptunghi. Pentru aceasta se va selecta cu butonul drept al
mouse-ului clasa dreptunghi şi în meniul derulant se va selecta linia:

new dreptunghi(int aa, int bb, int xx, int yy)


122

În POO crearea unei instanŃe a unei clase se face apelând


constructorul acesteia printr-o construcŃie :

obiect = new clasa(parametrii efectivi)

Mediul de programare va afişa o fereastră în care apare numele


noului obiect, dreptung1 (dat automat dar care poate fi modificat) sub
care apare apelul constructorului, pentru fiecare dintre parametri mediul
afişând câte o casetă de editare destinată introducerii valorii acestuia.

După apăsarea butonului Ok mediul va crea obiectul adăugând o


reprezentare a acestuia în partea inferioară a ferestrei.
123

În acest moment poate fi apelată oricare dintre funcŃiile (metodele)


clasei dreptunghi. Deoarece la apelul unei metode trebuie precizat
obiectul (setul de valori ale variabilelor de stare) asupra căruia aceasta
trebuie să opereze, iniŃierea apelului se va face selectând cu butonul drept
al mouse-ului obiectul (dreptung1) şi apoi, din lista de metode expusă se
selectează metoda dorită.

Pentru metoda arie() mediul de programare va afişa fereastra:

În continuare se va crea un nou obiect (căruia mediul îi va da


numele dreptung2) şi, folosind noul obiect, se va apela metoda perim().
124
125

ObservaŃii:

1. Clasa dreptunghi poate fi adăugata oricărui proiect fără nici o


modificare.

2. Apelul metodelor clasei nu necesită transmiterea unor valori, ca


în cazul funcŃiilor C++ din versiunea iniŃială a aplicaŃiei deoarece în POO
metodele acŃionează de regulă asupra variabilelor de stare ale clasei.
Dacă apelul unei metode nu se face folosind interfaŃa mediului de
programare, ca în exemplul prezentat, ci din interiorul altei metode, apelul
se va scrie obiect.metodă(). Exemplu:

s1 = dreptungh1.arie();

3. La definirea unei clase unii membri aparŃin clasei (de exemplu


metodele clasei) iar alŃii aparŃin instanŃelor, în cazul dat variabilele a, b, x
şi y.

Valorile variabilelor unei instanŃe pot fi afişate selectând instanŃa cu


butonul drept al mouse-ului şi apoi, din meniul contextual, opŃiunea
Inspect.
126

Utilizarea claselor
În exemplele precedente, dreptung1 şi dreptung2 sunt obiecte din
clasa dreptunghi sau, altfel spus, instanŃe ale clasei dreptunghi. Ele au
fost realizate folosind intrerfaŃa grafică a aplicaŃiei.

Într-o aplicaŃie obişnuită generarea obiectelor se realizează de


regulă în cadrul unei alte clase. Exemplul dat poate fi completat prin
adăugarea unei clase noi, denumită figuri, pe care o putem considera
principală, în care vor fi incluse liniile care realizează declararea obiectelor
necesare. Generarea obiectelor se va realiza în constructorul noii clase.

Pentru a adăuga noua clasă se apasă butonul New Class, i se dă


numele în fereastra care se afişează şi i se editează declaraŃia ca mai jos.

public class figuri


{
// instance variables - replace the example below with your own
private dreptunghi d1, d2;

/**
* Constructor for objects of class figuri
*/
public figuri()
{
// initialise instance variables
d1 = new dreptunghi(20,30,2,0);
127

d2 = new dreptunghi(20,30,2,0);
}

}
Faptul că noua clasă foloseşte clasa dreptunghi trebuie indicat prin
selectarea butonului (Insert a ‘uses’ relation) urmat de indicarea cu
mouse-ul în fereastra aplicaŃiei a claselor figuri şi dreptunghi. RelaŃia va fi
reprezentată printr-o linie punctată.

Notă : Fereastra aplicaŃiei BlueJ conŃine reprezentarea aplicaŃiei


sub forma unei diagrame UML (Unified Modeling Language). UML este un
limbaj folosit pentru reprezentarea schematică a structurii aplicaŃiilor
software.

După crearea unui obiect din clasa figuri se poate vedea conŃinutul
acestuia.
128

Reprezentarările pentru d1 şi d2 sunt folosite pentru a indica faptul


că ambele variabile conŃin referinŃe la obiecte (adrese ale obiectelor). În
Java o variabilă poate conŃine fie o valoare aparŃinând unui tip de dată
elementar (byte, short, int, long, float, double, char sau boolean), fie o
referinŃă.

Noua versiune a proiectului poate fi extinsă prin adăugarea de


exemplu a noi clase destinate reprezentării altor figuri geometrice
concomitent cu adăugarea în constructorul clasei figuri a unor linii de cod
care crează instanŃe ale noilor clase. În reprezentarea grafică a aplicaŃiei
noile clase vor fi legate de clasa figuri prin aceaşi relaŃie ca şi clasa
dreptunghi (relaŃii ‘uses’)
129

Clase derivate

Obiectivul central al programării orientate pe obiecte este asigurarea reutilizării


în cadrul altor aplicaŃii a codului scris fără a se opera nici o modificare. Se poate
însă ca în noua aplicaŃie utilizarea în forma originală a clasei preluate să nu fie
posibilă. Deoarece varianta modificării clasei preluate ar contrazice obiectivul
enunŃat (preluare fără modificări!), în POO o clasă poate avea clase derivate. Clasa
iniŃială se numeşte în acest caz clasă de bază. Clasa derivată moşteneşte membrii
date şi metodele clasei de bază. În clasa derivată pot fi operate însă completările şi
corecturile dorite. De regulă în clasa derivată sunt adăugaŃi noi parametri şi noi
funcŃii şi sunt rescrise (suprascrise) unele dintre metodele clasei de bază.
Pe lângă ameliorarea structurii sau conŃinutul metodelor clasei de bază,
posibilitatea declarării claselor derivate conduce la definirea unor taxonomii de clase,
similare celor folosite în biologie. Acestea permit o modelare elegantă a datelor
pentru aplicaŃiile care operează în acelaşi domeniu.
Reconsiderând aplicaŃia începută se va realiza o structură de clase ca în
figură.

Pentru a indica faptul că dreptunghi este o clasă derivată din punct se


selectează butonul încercuit din imagine şi apoi se selectează succesiv clasa
dreptunghi şi punct.
130

Clasa de bază punct conŃine doar două variabile întregi, x şi y.

public class punct


{
private int x, y;

public punct(int xx, int yy)


{
// initialise instance variables
x = xx;
y = yy;
}

public void desenez()


{
// put your code here
// Desenez un punct
}
}

Clasa dreptunghi, derivată din punct, conŃine pe lângă variabilele moştenite (x


şi y), două variabile întregi, a şi b. În clasa dreptunghi sunt adăugate metodele arie()
şi perim() şi este suprascrisă metoda desenez().

public class dreptunghi extends punct


{
private int a;
private int b;

/**
* Constructor for objects of class dreptunghi
*/
public dreptunghi(int aa, int bb, int xx, int yy)
{
// initialise instance variables
super(xx, yy);
a = aa;
b = bb;
}

public int arie()


{
return a * b;
}

public int perim()


{
return 2*a + 2*b;
}
131

public void desenez()


{
// Se deseneaza dreptunghiul
}
}

Clasa cerc, derivată tot din punct, conŃine în plus variabila întreagă r. Ca şi în
cazul clasei dreptunghi, în clasa cerc sunt adăugate metodele arie() şi perim() şi este
suprascrisă metoda desenez().

public class cerc extends punct


{
private int r;

public cerc(int rr, int xx, int yy)


{
// initialise instance variables
super(xx, yy);
r = rr;
}

public double arie()


{
return Math.PI * r * r;
}

public double perim()


{
return 2 * Math.PI * r;
}

public void desenez()


{
// Se deseneaza cercul
}
}

ObservaŃii:
1. RelaŃia de derivare este exprimată prin clauza extends ...:
public class cerc extends punct ...

2. Clasele nou declarate conŃin variabile suplimentare. În constructor, pentru


a iniŃializa variabilele moştenite (x şi y) se apelează constructorul clasei de
bază prin apelul:
super(xx, yy);
132

3. Atât variabilele clasei de bază cât şi variabilele claselor derivate au fost


declarate private. O variabilă stfel declarată poate fi accesată doar în
cadrul clasei în care este declarată. Pentru a accesa o variabilă private
înafara clasei proprii, clasa acesteia trebuie să conŃină obligatoriu două
metode: una va realiza impunerea unei noi valori iar a doua va returna
valoarea variabilei. Exemplu:
class Geom
{
private int xPos; // variabila clasei Geom
...
public int getXPos()
{
return xPos;
}

public void setXPos(int noulX)


{
xPos = noulX;
}
...

FuncŃiile declarate public getXPos() şi setXPos() vor putea fi apelate atât din
clasele derivate cât şi din oricare altă clasă a aplicaŃiei în care există obiecte
din clasa Geom.
Accesul în cadrul unei clase derivate la variabilele clasei de bază poate fi
realizat şi direct, fără utilizarea unor functii de acces, dacă în loc de private
acestea sunt declarate protected.
Exemplu:
protected int xPos; // variabila clasei Geom accesibila si in cls. derivate

În Java o clasă nu poate avea decât o clasă părinte. Se spune că Java nu


acceptă moştenirea multiplă. Din acest motiv în clasa derivată apelul constructorului
clasei de bază se realizează folosind metoda super(), fără a preciza clasa de bază.

În continuare se poate adăuga proiectului clasa principală figuri în care vor fi


create instanŃe ale claselor definite: punct, dreptunghi şi cerc şi vor fi apelate unele
dintre metodele acestora. Între clasele punct, dreptunghi şi cerc şi clasa figuri vor fi
declarate legăturile uses... necesare.
133

public class figuri


{
// instance variables - replace the example below with your own
private punct p1, p2, p3;
private dreptunghi d1, d2;
private cerc c;

/**
* Constructor for objects of class figuri
*/
public figuri()
{
// initialise instance variables
p1 = new punct(20, 30);
d1 = new dreptunghi(32,24,20,30);
p2 = new punct(45, 34);
d2 = new dreptunghi(20,30,45,34);
p3 = new punct(65, 75);
c = new cerc(124, 65, 75);
System.out.println("Aria dreptunghiului d1 este " + d1.arie());
System.out.println("Perim. dreptunghiului d1 este " + d1.perim());
System.out.println("Aria cercului c este " + c.arie());
System.out.println("Perim cercului c este " + c.perim());
double s_arii = d1.arie() + d2.arie() + c.arie();
double s_perim = d1.perim() + d2.perim() + c.perim();
}
134

ObservaŃie: În Java scrierea pe consolă se realizează folosind funŃia


System.out.println(). Pentru formarea şirului de caractere care se va imprima se
foloseşte ca operator de concatenare '+':

System.out.println("Perim. dreptunghiului d1 este " + d1.perim());


135

Anexă

Pentru înŃelegerea programelor scrise în Java, s-a inclus o scurtă prezentare a


elementelor de bază ale limbajului.

Tratarea programelor scrise în Java

Un program scris în limbajul Java este supus unei compilări în urma căreia se
obŃine un cod intermediar (cod de octeŃi) care este apoi interpretat şi executat de o
aplicaŃie specializată, care poate fi asimilată unui procesor virtual. Această aplicaŃie
poartă denumirea de "maşină virtuală java" (eng. Java Virtual Machine, JVM
denumită mai nou JRE – Java Runtime Environment). Codul rezultat în urma
compilării poate fi transferat şi apoi executat pe orice calculator pe care există instalat
JVM. Site-ul firmei Sun oferă spre descărcare, gratuit, aplicaŃia JVM pentru toate
sistemele de operare majore.

Scurtă prezentare a limbajului Java

Fiind derivat din C++, limbajul Java nu pune probleme dificile celor care
cunosc acest limbaj. De aceea prezentarea elementelor fundamentale ale limbajului
va fi realizată foarte succint.

Comentarii
Programele Java conŃin explicaŃii sub forma unor comentarii. Acestea vor
asigura în timp înŃelegerea diferitelor metode şi rolul funcŃional al variabilelor folosite.
Într-un program scris în Java pot fi folosite două tipuri de comentarii:
• comentarii "în linie", introduse prin //. Un astfel de comentariu se încheie
la sfârşitul liniei curente;
• comentarii pe unul sau mai multe rânduri consecutive. Zona care conŃine
comentariul este delimitată prin /* (comentariu) */.
136

De regulă se folosesc comentariile în linie, cel de-al doilea tip fiind folosit
frecvent în timpul depanării programelor mari şi complexe, pentru a suprima din
program anumite zone.
Comentariile care încep cu /** sunt prelucrate de aplicaŃia javadoc pentru
realizarea automată a unei pagini web conŃinând comentariile programatorului.
Această facilitate este folosită pentru documentarea rapidă a programelor mari,
compuse din mai multe clase.

Variabile
În Java numele unei variabile, metode sau clase poate fi orice combinaŃie de
litere şi cifre, începând cu o literă. Caracterele '_' (underscore) şi '$' sunt considerate
litere şi pot intra în construcŃia numelor. Nu pot fi folosite ca nume cuvintele
rezervate folosite la definirea limbajului.

abstract double int strictfp

boolean else interface super

break extends long switch

byte final native synchronized

case finally new this

catch float package throw

char for private throws

class goto protected transient

const if public try

continue implements return void

default import short volatile

do instanceof static while

true false null


137

Tipuri de date elementare


În Java, ca şi în alte limbaje evoluate, sunt definite 8 tipuri de date elementare
(primitive):

Cuvânt cheie
Descriere Mărime/Reprezentare internă
pt. declarare
(numere întregi)
byte Întreg reprezentat pe un octet 8-biŃi, repr. in compl. faŃă de 2
short Întreg scurt 16-biŃi, repr. in compl. faŃă de 2
int Intreg 32-biŃi, repr. in compl. faŃă de 2
long Întreg lung 64-biŃi, repr. in compl. faŃă de 2

(numere reale)
float Simplă precizie 32-biŃi, IEEE 754
double Dublă precizie 64-biŃi IEEE 754

(alte tipuri)
char Un caracter 16-biŃi, repr. Unicode
boolean O valoare logică true sau false

Spre deosebire de alte limbaje, în Java informaŃiile din tabelul precedent sunt
valabile indiferent de calculatorul pe care se execută programul.

ObservaŃii asupra tipului char:


În Java un caracter se reprezintă încadrat între apostroafe. Astfel 'C' sau '&'
sunt caractere. Unele caractere nu au simbol grafic. Cele mai uzuale se pot totuşi
introduce folosind o succesiune de două caractere (secvenŃă escape) astfel: '\n' (LF),
'\a' (bell), '\b' (backspace), '\f' (pagină nouă, formfeed), '\r' (retur car, carriage return),
'\t' (tab orizontal), '\v' (tab vertical). Un exemplu în acest sens poate fi scris pornind
de la succesiunea de apeluri de metode care realizează afişarea pe ecran a
rezultatelor programului scris mai sus:
System.out.println("Gr. (barbat) = " + g + " kg");
System.out.println("Gr. (femeie) = " + 0.9*g + " kg");
138

System.out.println() asigură trecerea la linie nouă după afişarea şirului de


caractere introdus ca şi argument. Dacă însă folosim un singur apel, acelaşi rezultat
se obŃine folosind secvenŃa \n:
System.out.println("Gr. (barbat) = " + g + " kg\nGr. (femeie) = " + 0.9*g + " kg");

Şiruri
Pentru a utiliza un şir, în Java trebuie declarat şi apoi realizată alocarea
memoriei necesare.
Exemple fundamentale:
int a[]; // Se poate scrie si int [] a;
a = new int[7];
int b[] = {1, 3, 4, 6, 10};

Pentru şirul a se va rezerva în memorie o succesiune de 7 locaŃii. Deoarece


elementele şirului a sunt de tip int, fiecare locaŃie va avea lungimea de 4 octeŃi.
Şirul b a fost declarat şi iniŃializat în acelaşi timp. Pentru elementele şirului b
se vor rezerva 5 locaŃii de memorie consecutive.
Pentru referirea elementelor şirurilor se folosesc indici. Astfel, după
declararea şirului a se va putea scrie:
a[0] = 12;
a[2] = 21;
a[3] = a[0] + a[2];

Şirurile pot avea două sau chiar mai multe dimensiuni. Exemplu:
int [ ] [ ] c;
c = new int [3] [4];
c[0] [2] = 17;
System.out.println("c(0,2) ="+c[0] [2]);

Lungimea unui şir, indiferent de tipul componentelor acestuia, poate fi obŃinută


folosind proprietatea .length.
Exemplu:

for (i=0; i<a.length; i++)


139

Clasa String
În Java şirurile de caractere sunt obiecte aparŃinând clasei String. Declararea
unui şir de caractere poate fi realizată fie scriind:

String unu="Thomas ";

fie ca şi în cazul declarării şi iniŃializării obiectelor:


String doi;
doi = new String("Jerry");
Un şir de char (declarat char [ ]) poate fi transformat într-un obiect aparŃinând
clasei String. Exemplu:
char data[] = {'a', 'b', 'c'};
String str = new String(data);

Unirea mai multor obiecte de tip String anterior definite se realizează folosind
operatorul '+', astfel:
String trei;
trei=unu+" & " + doi; // rezultat "Thomas & Jerry"

Se pot defini şi şiruri de şiruri de caractere. Un astfel de şir se declară


folosind o construcŃie sintactică de tipul
String [ ] args ;

Literali
În timpul scrierii unui program, programatorul foloseşte frecvent literali.
Literalii sunt valori aparŃinând tipurilor primitive prezentate. Compilatorul analizează
aceste valori, le stabileşte tipul, le converteşte şi le memorează în locaŃii din
memorie. De exemplu, în clasa Greutate apărea atribuirea:
h = 178;
Compilatorul va asocia literalului "178" tipul int., va face conversia în binar
corespunzătoare şi va memora rezultatul într-o zonă din memorie având o lungime
de 4 octeŃi. La fel, în expresia greutăŃii:
g = 50.0+0.75*(h-150)+0.25*(v-20);
140

compilatorul va considera că 50.0, 0.75 şi 0.25 sunt double (numere reale în dublă
precizie) iar 150 şi 20 sunt int (numere întregi).

Exemple fundamentale:

Literal Tipul de dată


178 int

8864L long

37.266 double

37.266D double

87.363F float

26.77e3 double

'c' char

true boolean

false boolean

Operatorii limbajului Java


În definirea unui limbaj, stabilirea operatorilor care pot fi folosiŃi la scrierea
expresiilor şi a regulilor lor de utilizare reprezintă o etapă importantă. Limbajele de
nivel înalt folosesc un mare număr de operatori şi chiar permit extinderea setului de
operatori pentru a putea scrie expresii în care intervin variabile aparŃinând tipurilor
structurate (obiecte).

Operatorii matematici din Java


+ - * / % (modulo)
x % y furnizează restul împărŃirii întregi a lui x la y.

Exemplu de utilizare a operatorului '%':

if((an % 4 == 0 && an % 100 !=0) || an % 400 == 0)


System.out.println(an + " este bisect.");
Operatorul % nu se aplică tipurilor float şi double.
141

Operatorul "/" poate provoca trunchiere în cazul operanzilor întregi.

Evaluarea expresiilor aritmetice se efectuează de la stânga la dreapta


respectând ordinea de evaluare normală.

Operatorii de comparare şi logici


Operatorii de comparare (relaŃionali) din Java sunt : > >= < <= == !=
Operatorii de comparare au o prioritate inferioară celor aritmetici :
i < lim + 1 se evaluează ca şi i < (lim + 1)
O expresiile în care intervine o succesiune de operatori logici && (şi) sau o
succesiune de operatori || (sau) sunt evaluate de la stânga la dreapta şi evaluarea
expresiei încetează când se ştie deja valoarea de adevăr a rezultatului.
&& e mai prioritar ca şi || iar ambele sunt mai puŃin prioritare ca şi operatorii
de comparaŃie.
Operatorul ! (negaŃie)
if (!corect) . . . identic cu if (corect == false) . . .

Conversiile de tip
Când într-o expresie intervin operanzi de tipuri diferite, operanzii
corespunzând unui tip mai restrictiv se convertesc automat spre tipul mai general
astfel încât nu se produce pierdere de informaŃie.

Dacă rezultatul unei expresii este float sau double şi este atribuit unei
variabile de tip întreg, compilatorul va sesiza posibila pierdere de informaŃie şi va
semnala o eroare.

Operatorii de conversie de tip (transtipaj sau cast)


(nume-tip) expresie
expresie este convertită în tipul specificat :
x = Math.sqrt((double)n)
alfa = (float)a / j ;
142

Operatorii de incrementare şi de decrementare


++ şi --
În funcŃie de poziŃia operatorului faŃă de variabila incrementată, se realizează
pre şi post incrementare (decrementare)

int n = 5 ;

x = n++ ; x = ++n ;
atribuie 5 lui x atribuie 6 lui x

Operatorii şi expresiile de atribuire


Expresia :
i = i + 3;
în care variabila din stânga egalului se repetă în dreapta acestuia se mai poate
scrie astfel :
i += 3 ;
+= este în acest caz un operator de atribuire.

În general în Java,
exp1 op= exp2 ; echivalează cu
exp1 = exp1 op (exp2) ;
unde op este + - * / %.

Exemplu fundamental:
x *= y + 1 ;
echivalează cu :
x = x * (y + 1) ;
şi nu cu
x=x*y+1;

Expresiile condiŃionale
Pentru a calcula expresia z = max(a, b) ;
se poate scrie
143

if (a > b)
max = a ;
else
max = b ;

Limbajul Java oferă şi o altă cale :


max = (a > b) ? a : b ;

InstrucŃiunile limbajului Java

InstrucŃiunea de decidere - if

Ansamblul de instrucŃiuni cuprinse între acolade formează o instrucŃiune


compusă sau un bloc de instrucŃiuni. InstrucŃiunile din interiorul unui bloc de
instrucŃiuni sunt executate în ordinea în care sunt scrise.

Variante de scriere a instrucŃiunii if


if (expLogica )
if ( expLogica ) {
instrucŃiune; mai multe instrucŃiuni
}
if (expLogica ) if (expLogica )
instrucŃiune; {
else mai multe instrucŃiuni
instrucŃiune; }
else
{
mai multe instrucŃiuni
}
if (expLogica ) if (expLogica )
instrucŃiune; {
else mai multe instrucŃiuni
{ }
mai multe instrucŃiuni else
} instrucŃiune;
144

Indentarea (scrierea decalată) instrucŃiunilor sau a blocurilor de instrucŃiuni


din if nu este obligatorie dar are mare importanŃă în înŃelegerea şi depanarea
programului.

InstrucŃiunea while
InstrucŃiunea while permite realizarea unei structuri repetitive (ciclu)
condiŃionate anterior. Corpul ciclului poate fi executat o dată, de mai multe ori sau de
loc.
Exemplu fundamental:

int contor = 1;
while ( contor <= 3 )
{
System.out.println("Contor = "+contor);
contor = contor + 1; // sau mai bine contor++
}

System.out.println("La revedere!");

Sintaxa instrucŃiunii while este:


while ( condiŃie )
instrucŃiune

CondiŃia este o expresie logică.

Sintaxa instructiunii while


while ( condiŃie )
while ( condiŃie ) {
instrucŃiune; una sau m.
m.instrucŃiuni
}

InstrucŃiunea do

Pentru programarea unui ciclu poate fi folosită întotdeauna instrucŃiunea while.


Deoarece while începe prin executarea unui test, în cazul în care variabila testată nu
poate primi valori decât în interiorul ciclului, programatorul trebuie să-i dea la început
o valoare convenabilă pentru a determina intrarea în ciclu. Exacutarea instrucŃiunilor
din corpul ciclului va corecta automat valoarea iniŃială.
145

Pentru astfel de cazuri există însă şi o cale mai simplă, respectiv folosirea
instrucŃiunii do.

Exemplu:

g = 9.81;
t = 0;
do
{
d = (g * t * t ) / 2;
System.out.println( t + " " + d);
t = t + 1;
}
while (d <= 500);

InstrucŃiunea for
InstrucŃiunea for este preferată ori de câte ori trebuie realizat un ciclu care
foloseşte un contor. Ea poate fi însă folosită însă în toate cazurile în care trebuie să
realizăm un ciclu, şi reprezintă o modalitate compactă şi elegantă de scriere a
acestora.
Dacă înaintea unui ciclu trebuie realizate mai multe iniŃializări, acestea pot
scrise în for una după alta, despărŃite prin virgule:

class Suma
{
public static void main ( String[] args )
{
int [] a = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int i, sum;
for (i=0,sum = 0; i<a.length; i++)
sum = sum + a[i];
System.out.println("Suma elementelor sirului a este: "+sum);
}
}

Oricare dintre cele trei părŃi ale instrucŃiunii for pot lipsi. Lipsa condiŃiei de
reluare este echivalentă cu a scrie o condiŃie care este întotdeauna adevărată.
Ieşirea dintr-un astfel de ciclu se poate face folosind instrucŃiunea break.
Exemplu:
146

for ( ; ; )
{
..
break;
..
}

Executarea instrucŃiunii break provoacă o ieşire imediată din ciclul for. Ea


poate fi folosită şi pentru a ieşi din ciclurile while sau do.

InstrucŃiunea switch
InstrucŃiunile de ciclare prezentate, while, do şi for sunt folosite pentru
realizarea blocurilor de instrucŃiuni a căror execuŃie începe cu prima linie şi este
controlată de către programator. InstrucŃiunea switch este folosită tot pentru a
construi un bloc de instrucŃiuni dar punctul de unde începe execuŃia depinde de
valoarea unei expresii având valori întregi.
Sintaxa instrucŃiunii este:

switch (expresie)
{
case constanta_1 : instrucŃiuni
case constanta_2 : instrucŃiuni
...
default : instrucŃiuni;
}

Fiecare dintre punctele de unde poate începe execuŃia blocului este etichetat
printr-o constantă având valoare întreagă. Dacă expresia de testat corespunde uneia
dintre constante, execuŃia blocului începe din punctul indicat de aceasta.
Cazul default este facultativ.

Exemplu :
switch (t)
{
case 's' :
rez = Math.sin(Math.PI * x / 180.);
System.out.println("rezultatul este : "+rez);
break;
case 'c' :
147

rez = Math.cos(Math.PI * x / 180.);


System.out.println("rezultatul este : "+rez);
break;
case 't' :
rez = Math.sin(Math.PI * x / 180.)/Math.cos(3.14159 * x / 180.);
System.out.println("rezultatul este : "+rez);
break;
default:
System.out.println("Caracter incorect!");
}

Ca şi în cazul ciclurilor, instrucŃiunea break provoacă o ieşire imediată din


blocul realizat folosind switch.

Realizarea aplicaŃiilor complexe

O aplicaŃie scrisă în Java constă dintr-o clasă sau un ansamblu de clase. În


cazul în care aplicŃia cuprinde mai multe clase, una dintre ele va fi clasa principală,
respectiv va conŃine metoda statică main().
Divizarea unei aplicaŃii în clase crează premisa lucrului pe secvenŃe de cod de
dimensiuni reduse, uşor de realizat şi mai ales de depanat. Fiecare clasă este
specializată pe prelucrarea variabilelor clasei (membrii date ai clasei). Metodele
clasei sunt module de mici dimensiuni, fiecare având un rol funcŃional elementar.
Practic dezvoltarea unei clase înseamnă două lucruri:
1. identificarea variabilelor (membrilor date) care vor păstra proprietăŃile
obiectelor care vor fi declarate în continuare şi
2. scrierea unui ansamblu complet şi coerent de metode care să asigure
crearea şi evoluŃia membrilor date ai clasei.
Pentru a se executa codul dintr-o metodă aceasta trebuie apelată. Apelul se
realizează de regulă din altă metodă a aceleiaşi clase sau a altei clase aparŃinând
aplicaŃiei. La scrierea apelului metodei, numele acesteia este precedat fie de numele
obiectului ale cărui date trebuie prelucrate fie de numele clasei căreia îi aparŃine
metoda. Al doilea caz se referă la metode care prelucrează eventual parametrii
transmişi în momentul apelului, ca în cazul metodelor care implementează funcŃii
matematice (sin, cos etc.).
Metodele de acest ultim fel sunt declarate folosind declaraŃia static.
Structura lexicală folosită la apelul unei metode poate fi deci fie
obiect.metoda(); fie clasă.metodă();
148

Exemple:
p1.translatez(3, 10); // abscisa si ordonata punctului p1 sunt modificate
y = r * Math.sin(x); // sin() este o metodă statică a clasei Math
k = Integer.parseInt(args[1]); // parseInt() este o met. statică a clasei Integer

Vizibilitatea variabilelor
Vizibilitatea unei variabile se defineşte ca zona din program în care aceasta
este cunoscută deci poate fi accesată. Regulile privind vizibilitatea variabilelor în
Java pot fi reprezentate grafic.

class vizvar {
zona de vizib. a
var. clasei
declaraŃii variabile membre

zona de vizib. a public void metoda_1( declaratii parametri)


param. metodei

declaraŃii variabile locale


zona de vizib. a var.
locale catch (param. exceptie) {

zona de vizib. a
param. excepŃiei

}
Din punct de vedere al locului declarării, o variabilă poate fi membră a clasei
(declarată în afara oricărei metode) sau locală (declarată în interiorul unei metode, de
obicei la la începutul acesteia sau la începutul unui bloc din interiorul acesteia).
Variabilele locale aparŃinând unor blocuri separate sunt diferite, chiar dacă
poartă acelaşi nume. Se recomandă totuşi folosirea unor nume de variabile distincte
şi mai ales sugestive, care să ajute programatorul în urmărirea logicii programului.
Unei variabile membre a clasei i se alocă spaŃiu în memorie în momentul
creării unei instanŃe a clasei folosind operatorul new.
Variabilele locale există pe timpul execuŃiei blocului în care au fost declarate şi
îşi încetează existenŃa în momentul ieşirii din acesta.

S-ar putea să vă placă și