12. Capitolul 1
Introducere ˆ Java
ın
1.1 Ce este Java ?
Java este o tehnologie inovatoare lansat˘ de compania Sun Microsystems ˆ
a ın
1995, care a avut un impact remarcabil asupra ˆ ıntregii comunit˘¸i a dez-
at
voltatorilor de software, impunˆndu-se prin calit˘¸i deosebite cum ar fi sim-
a at
plitate, robustete ¸i nu ˆ ultimul rˆnd portabilitate. Denumit˘ initial OAK,
¸ s ın a a ¸
tehnologia Java este format˘ dintr-un limbaj de programare de nivel ˆ
a ınalt pe
baza c˘ruia sunt construite o serie de platforme destinate implement˘rii de
a a
aplicatii pentru toate segmentele industriei software.
¸
1.1.1 Limbajul de programare Java
Inainte de a prezenta ˆ detaliu aspectele tehnice ale limbajului Java, s˘ am-
ın a
intim caracteristicile sale principale, care l-au transformat ˆ
ıntr-un interval de
timp atˆt de scurt ˆ
a ıntr-una din cele mai pupulare optiuni pentru dezvoltarea
¸
de aplicatii, indiferent de domeniu sau de complexitatea lor.
¸
• Simplitate - elimin˘ supraˆ arcarea operatorilor, mo¸tenirea multipl˘
a ınc˘ s a
¸i toate ”facilit˘¸ile” ce pot provoca scrierea unui cod confuz.
s at
• U¸urint˘ ˆ crearea de aplicatii complexe ce folosesc programarea ˆ
s ¸a ın ¸ ın
retea, fire de executie, interfat˘ grafic˘, baze de date, etc.
¸ ¸ ¸a a
• Robustete - elimin˘ sursele frecvente de erori ce apar ˆ programare
¸ a ın
prin renuntarea la pointeri, administrarea automat˘ a memoriei ¸i elim-
¸ a s
11
13. 12 CAPITOLUL 1. INTRODUCERE ˆ JAVA
IN
inarea pierderilor de memorie printr-o procedur˘ de colectare a obiectelor
a
care nu mai sunt referite, ce ruleaz˘ ˆ fundal (”garbage collector”).
a ın
• Complet orientat pe obiecte - elimin˘ complet stilul de programare
a
procedural.
• Securitate - este un limbaj de programare foarte sigur, furnizˆnd a
mecanisme stricte de securitate a programelor concretizate prin: ver-
ificarea dinamic˘ a codului pentru detectarea secventelor periculoase,
a ¸
impunerea unor reguli stricte pentru rularea proceselor la distant˘, etc.
¸a
• Neutralitate arhitectural˘ - comportamentul unei aplicatii Java nu
a ¸
depinde de arhitectura fizic˘ a ma¸inii pe care ruleaz˘.
a s a
• Portabililtate - Java este un limbaj independent de platforma de lu-
cru, aceea¸i aplicatie rulˆnd f˘r˘ nici o modificare ¸i f˘r˘ a necesita re-
s ¸ a aa s aa
compilarea ei pe sisteme de operare diferite cum ar fi Windows, Linux,
Mac OS, Solaris, etc. lucru care aduce economii substantiale firmelor
¸
dezvoltatoare de aplicatii.
¸
• Este compilat ¸i interpretat, aceasta fiind solutia eficient˘ pentru
s ¸ a
obtinerea portabilit˘¸ii.
¸ at
• Performant˘ - de¸i mai lent decˆt limbajele de programare care genereaz˘
¸a s a a
executabile native pentru o anumit˘ platform˘ de lucru, compilatorul
a a
Java asigur˘ o performant˘ ridicat˘ a codului de octeti, astfel ˆ at
a ¸a a ¸ ıncˆ
viteza de lucru putin mai sc˘zut˘ nu va fi un impediment ˆ dezvoltarea
¸ a a ın
de aplicatii oricˆt de complexe, inclusiv grafic˘ 3D, animatie, etc.
¸ a a ¸
• Este modelat dup˘ C ¸i C++, trecerea de la C, C++ la Java
a s
f˘cˆndu-se foarte u¸or.
a a s
1.1.2 Platforme de lucru Java
Limbajul de programare Java a fost folosit la dezvoltarea unor tehnologii ded-
icate rezolv˘rii unor probleme din cele mai diverse domenii. Aceste tehnologii
a
au fost grupate ˆ a¸a numitele platforme de lucru, ce reprezint˘ seturi de
ın s a
libr˘rii scrise ˆ limbajul Java, precum ¸i diverse programe utilitare, folosite
a ın s
pentru dezvoltarea de aplicatii sau componente destinate unei anume cate-
¸
gorii de utilizatori.
14. 1.1. CE ESTE JAVA ? 13
• J2SE (Standard Edition)
Este platforma standard de lucru ce ofer˘ suport pentru crearea de
a
aplicatii independente ¸i appleturi.
¸ s
De asemenea, aici este inclus˘ ¸i tehnologia Java Web Start ce furnizeaz˘
as a
o modalitate extrem de facil˘ pentru lansarea ¸i instalarea local˘ a pro-
a s a
gramelor scrise ˆ Java direct de pe Web, oferind cea mai comod˘ solutie
ın a ¸
pentru distributia ¸i actualizarea aplicatiilor Java.
¸ s ¸
• J2ME (Micro Edition)
Folosind Java, programarea dispozitivelor mobile este extrem de simpl˘,
a
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 aplicatii com-
a a a a ¸
plexe, formate din componente ce trebuie s˘ ruleze ˆ sisteme eterogene,
a ın
cu informatiile memorate ˆ baze de date distribuite, etc.
¸ ın
Tot aici g˘sim ¸i suportul necesar pentru crearea de aplicatii ¸i servicii
a s ¸ s
Web, bazate pe componente cum ar fi servleturi, pagini JSP, etc.
Toate distributiile Java sunt oferite gratuit ¸i pot fi desc˘rcate de pe
¸ s a
Internet de la adresa ”http://java.sun.com”.
In continuare, vom folosi termenul J2SDK pentru a ne referi la distributia
¸
standard J2SE 1.5 SDK (Tiger).
1.1.3 Java: un limbaj compilat ¸i interpretat
s
In functie de modul de executie a aplicatiilor, limbajele de programare se
¸ ¸ ¸
ˆ
ımpart ˆ dou˘ categorii:
ın a
• Interpretate: instructiunile sunt citite linie cu linie de un program
¸
numit interpretor ¸i traduse ˆ instructiuni ma¸in˘. Avantajul aces-
s ın ¸ s a
tei solutii este simplitatea ¸i faptul c˘ fiind interpretat˘ direct sursa
¸ s a a
programului obtinem portabilitatea. Dezavantajul evident este viteza
¸
de executie redus˘. Probabil cel mai cunoscute limbaj interpretat este
¸ a
limbajul Basic.
• Compilate: codul surs˘ al programelor este transformat de compi-
a
lator ˆ
ıntr-un cod ce poate fi executat direct de procesor, numit cod
15. 14 CAPITOLUL 1. INTRODUCERE ˆ JAVA
IN
ma¸in˘. Avantajul este executia extrem de rapid˘, dezavantajul fiind
s a ¸ a
lipsa portabilit˘¸ii, codul compilat ˆ
at ıntr-un format de nivel sc˘zut nu
a
poate fi rulat decˆt pe platforma de lucru pe care a fost compilat.
a
Limbajul Java combin˘ solutiile amintite mai sus, programele Java fiind
a ¸
atˆt interpretate cˆt ¸i compilate. A¸adar vom avea la dispozitie un compi-
a a s s ¸
lator responsabil cu transformarea surselor programului ˆ a¸a numitul cod
ın s
de octeti, precum ¸i un interpretor ce va executa respectivul cod de octeti.
¸ s ¸
Codul de octeti este diferit de codul ma¸in˘. Codul ma¸in˘ este reprezen-
¸ s a s a
tat de o succesiune de instructiuni specifice unui anumit procesor ¸i unei an-
¸ s
umite platforme de lucru reprezentate ˆ format binar astfel ˆ at s˘ poat˘
ın ıncˆ a a
fi executate f˘r˘ a mai necesita nici o prelucrare.
aa
Codurile de octeti sunt seturi de instructiuni care seam˘n˘ cu codul scris
¸ ¸ a a
ˆ limbaj de asamblare ¸i sunt generate de compilator independent de mediul
ın s
de lucru. In timp ce codul ma¸in˘ este executat direct de c˘tre procesor ¸i
s a a s
poate fi folosit numai pe platforma pe care a fost creat, codul de octeti este
¸
interpretat de mediul Java ¸i de aceea poate fi rulat pe orice platform˘ pe
s a
care este instalat˘ mediul de executie Java.
a ¸
Prin ma¸ina virtual˘ Java (JVM) vom ˆ ¸elege mediul de executie al
s a ınt ¸
aplicatiilor Java. Pentru ca un cod de octeti s˘ poat˘ fi executat pe un
¸ ¸ a a
anumit calculator, pe acesta trebuie s˘ fie instalat˘ o ma¸in˘ virtual˘ Java.
a a s a a
Acest lucru este realizat automat de c˘tre distributia J2SDK.
a ¸
1.2 Primul program
Crearea oric˘rei aplicatii Java presupune efectuarea urm˘torilor pa¸i:
a ¸ a s
1. Scriererea codului surs˘
a
class FirstApp {
public static void main( String args[]) {
System.out.println("Hello world!");
}
}
16. 1.2. PRIMUL PROGRAM 15
Toate aplicatiile Java contin o clas˘ principal˘(primar˘) ˆ care trebuie
¸ ¸ a a a ın
s˘ se gaseasc˘ metoda main. Clasele aplicatiei se pot gasi fie ˆ
a a ¸ ıntr-un singur
fi¸ier, fie ˆ mai multe.
s ın
2. Salvarea fi¸ierelor surs˘
s a
Se va face ˆ fi¸iere care au obligatoriu extensia java, nici o alt˘ exten-
ın s a
sie nefiind acceptat˘. Este recomandat ca fi¸ierul care contine codul surs˘
a s ¸ a
al clasei primare s˘ aib˘ acela¸i nume cu cel al clasei, de¸i acest lucru nu
a a s s
este obligatoriu. S˘ presupunem c˘ am salvat exemplul de mai sus ˆ fi¸ierul
a a ın s
C:introFirstApp.java.
3. Compilarea aplicatiei
¸
Pentru compilare vom folosi compilatorul javac din distributia J2SDK.
¸
Apelul compilatorului se face pentru fi¸ierul ce contine clasa principal˘ a
s ¸ a
aplicatiei sau pentru orice fi¸ier/fi¸iere cu extensia java. Compilatorul creeaz˘
¸ s s a
cˆte un fi¸ier separat pentru fiecare clas˘ a programului. Acestea au extensia
a s a
.class ¸i implicit sunt plasate ˆ acela¸i director cu fi¸ierele surs˘.
s ın s s a
javac FirstApp.java
In cazul ˆ care compilarea a reu¸it va fi generat fi¸ierul FirstApp.class.
ın s s
4. Rularea aplicatiei
¸
Se face cu interpretorul java, apelat pentru unitatea de compilare core-
spunz˘toare clasei principale. Deoarece interpretorul are ca argument de
a
intrare numele clasei principale ¸i nu numele unui fi¸ier, ne vom pozitiona
s s ¸
ˆ directorul ce contine fi¸ierul FirstApp.class ¸i vom apela interpretorul
ın ¸ s s
astfel:
java FirstApp
Rularea unei aplicatii care nu folose¸te interfat˘ grafic˘, se va face ˆ
¸ s ¸a a ıntr-o
fereastr˘ sistem.
a
17. 16 CAPITOLUL 1. INTRODUCERE ˆ JAVA
IN
Atentie
¸
Un apel de genul java c:introFirstApp.class este gre¸it!
s
1.3 Structura lexical˘ a limbajului Java
a
1.3.1 Setul de caractere
Limbajului Java lucreaz˘ ˆ mod nativ folosind setul de caractere Unicode.
a ın
Acesta este un standard international care ˆ
¸ ınlocuie¸te vechiul set de caractere
s
ASCII ¸i care folose¸te pentru reprezentarea caracterelor 2 octeti, ceea ce
s s ¸
ˆ
ınseamn˘ c˘ se pot reprezenta 65536 de semne, spre deosebire de ASCII, unde
a a
era posibil˘ reprezentarea a doar 256 de caractere. Primele 256 caractere
a
Unicode corespund celor ASCII, referirea la celelalte f˘cˆndu-se prin uxxxx,
a a
unde xxxx reprezint˘ codul caracterului.
a
O alt˘ caracteristic˘ a setului de caractere Unicode este faptul c˘ ˆ
a a a ıntreg
intervalul de reprezentare a simbolurilor este divizat ˆ subintervale numite
ın
blocuri, cˆteva exemple de blocuri fiind: Basic Latin, Greek, Arabic, Gothic,
a
Currency, Mathematical, Arrows, Musical, etc.
Mai jos sunt oferite cˆteva exemple de caractere Unicode.
a
• u0030 - u0039 : cifre ISO-Latin 0 - 9
• u0660 - u0669 : cifre arabic-indic 0 - 9
• u03B1 - u03C9 : simboluri grece¸ti α − ω
s
• u2200 - u22FF : simboluri matematice (∀, ∃, ∅, etc.)
• u4e00 - u9fff : litere din alfabetul Han (Chinez, Japonez, Coreean)
Mai multe informatii legate de reprezentarea Unicode pot fi obtinute la
¸ ¸
adresa ”http://www.unicode.org”.
1.3.2 Cuvinte cheie
Cuvintele rezervate ˆ Java sunt, cu cˆteva exceptii, cele din C++ ¸i au fost
ın a ¸ s
enumerate ˆ tabelul de mai jos. Acestea nu pot fi folosite ca nume de clase,
ın
18. ˘
1.3. STRUCTURA LEXICALA A LIMBAJULUI JAVA 17
interfete, variabile sau metode. true, false, null nu sunt cuvinte cheie,
¸
dar nu pot fi nici ele folosite ca nume ˆ aplicatii. Cuvintele marcate prin ∗
ın ¸
sunt rezervate, dar nu sunt folosite.
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
Incepˆnd cu versiunea 1.5, mai exist˘ ¸i cuvˆntul cheie enum.
a as a
1.3.3 Identificatori
Sunt secvente nelimitate de litere ¸i cifre Unicode, ˆ
¸ s ıncepˆnd cu o liter˘. Dup˘
a a a
cum am mai spus, identificatorii nu au voie s˘ fie identici cu cuvintele rezer-
a
vate.
1.3.4 Literali
Literalii pot fi de urm˘toarele tipuri:
a
• Intregi
Sunt acceptate 3 baze de numeratie : baza 10, baza 16 (ˆ
¸ ıncep cu car-
acterele 0x) ¸i baza 8 (ˆ
s ıncep cu cifra 0) ¸i pot fi de dou˘ tipuri:
s a
– normali - se reprezint˘ pe 4 octeti (32 biti)
a ¸ ¸
– lungi - se reprezint˘ pe 8 octeti (64 biti) ¸i se termin˘ cu caracterul
a ¸ ¸ s a
L (sau l).
19. 18 CAPITOLUL 1. INTRODUCERE ˆ JAVA
IN
• Flotanti
¸
Pentru ca un literal s˘ fie considerat flotant el trebuie s˘ aib˘ cel putin o
a a a ¸
zecimal˘ dup˘ virgul˘, s˘ fie ˆ notatie exponential˘ sau s˘ aib˘ sufixul
a a a a ın ¸ ¸ a a a
F sau f pentru valorile normale - reprezentate pe 32 biti, respectiv D
¸
sau d pentru valorile duble - reprezentate pe 64 biti.
¸
Exemple: 1.0, 2e2, 3f, 4D.
• Logici
Sunt reprezentati de true - valoarea logic˘ de adev˘r, respectiv false
¸ a a
- valoarea logic˘ de fals.
a
Atentie
¸
Spre deosebire de C++, literalii ˆ
ıntregi 1 ¸i 0 nu mai au semnificatia
s ¸
de adev˘rat, respectiv fals.
a
• Caracter
Un literal de tip caracter este utilizat pentru a exprima caracterele co-
dului Unicode. Reprezentarea se face fie folosind o liter˘, fie o secvent˘
a ¸a
escape scris˘ ˆ
a ıntre apostrofuri. Secventele escape permit specificarea
¸
caracterelor care nu au reprezentare grafic˘ ¸i reprezentarea unor car-
as
actere speciale precum backslash, apostrof, etc. Secventele escape pre-
¸
definite ˆ Java sunt:
ın
– ’b’ : Backspace (BS)
– ’t’ : Tab orizontal (HT)
– ’n’ : Linie nou˘ (LF)
a
– ’f’ : Pagin˘ nou˘ (FF)
a a
– ’r’ : Inceput de rˆnd (CR)
a
– ’"’ : Ghilimele
– ’’’ : Apostrof
– ’’ : Backslash
20. ˘
1.3. STRUCTURA LEXICALA A LIMBAJULUI JAVA 19
• Siruri de caractere
¸
Un literal ¸ir de caractere este format din zero sau mai multe caractere
s
ˆ
ıntre ghilimele. Caracterele care formeaz˘ ¸irul pot fi caractere grafice
as
sau secvente escape.
¸
Dac˘ ¸irul este prea lung el poate fi scris ca o concatenare de sub¸iruri
as s
de dimensiune mai mic˘, concatenarea ¸irurilor realizˆndu-se cu oper-
a s a
atorul +, ca ˆ exemplul: "Ana " + " are " + " mere ". Sirul vid
ın
este "".
Dup˘ cum vom vedea, orice ¸ir este de fapt o instant˘ a clasei String,
a s ¸a
definit˘ ˆ pachetul java.lang.
a ın
1.3.5 Separatori
Un separator este un caracter care indic˘ sfˆr¸itul unei unit˘¸i lexicale ¸i
a as at s
ınceputul alteia. In Java separatorii sunt urm˘torii: ( )
a [ ] ; , . .
Instructiunile unui program se separ˘ cu punct ¸i virgul˘.
¸ a s a
1.3.6 Operatori
Operatorii Java sunt, cu mici deosebiri, cei din C++:
• atribuirea: =
• operatori matematici: +, -, *, /, %, ++, -- .
Este permis˘ notatia prescurtat˘ de forma lval op= rval: x += 2 n
a ¸ a
-= 3
Exist˘ operatori pentru autoincrementare ¸i autodecrementare (post ¸i
a s s
pre): x++, ++x, n--, --n
Evaluarea expresiilor logice se face prin metoda scurtcircuitului: evalu-
area se opre¸te ˆ momentul ˆ care valoarea de adev˘r a expresiei este
s ın ın a
sigur determinat˘.
a
• operatori logici: &&(and), ||(or), !(not)
• operatori relationali: <, <=, >, <=, ==, !=
¸
• operatori pe biti: &(and), |(or), ^ (xor), ~ (not)
¸
• operatori de translatie: <<, >>, >>> (shift la dreapta f˘r˘ semn)
¸ a a
21. 20 CAPITOLUL 1. INTRODUCERE ˆ JAVA
IN
• operatorul if-else: expresie-logica ? val-true : val-false
• operatorul , (virgul˘) folosit pentru evaluarea secvential˘ a operatiilor:
a ¸ a ¸
int x=0, y=1, z=2;
• operatorul + pentru concatenarea ¸irurilor:
s
String s1="Ana";
String s2="mere";
int x=10;
System.out.println(s1 + " are " + x + " " + s2);
• operatori pentru conversii (cast) : (tip-de-data)
int a = (int)’a’;
char c = (char)96;
int i = 200;
long l = (long)i; //widening conversion
long l2 = (long)200;
int i2 = (int)l2; //narrowing conversion
1.3.7 Comentarii
In Java exist˘ trei feluri de comentarii:
a
• Comentarii pe mai multe linii, ˆ
ınchise ˆ
ıntre /* ¸i */.
s
• Comentarii pe mai multe linii care ¸in de documentatie, ˆ
t ¸ ınchise ˆ
ıntre
/** ¸i */. Textul dintre cele dou˘ secvente este automat mutat ˆ
s a ¸ ın
documentatia aplicatiei de c˘tre generatorul automat de documentatie
¸ ¸ a ¸
javadoc.
• Comentarii pe o singur˘ linie, care incep cu //.
a
Observatii:
¸
• Nu putem scrie comentarii ˆ interiorul altor comentarii.
ın
• Nu putem introduce comentarii ˆ interiorul literalilor caracter sau ¸ir
ın s
de caractere.
• Secventele /* ¸i */ pot s˘ apar˘ pe o linie dup˘ secventa // dar ˆsi
¸ s a a a ¸ ı¸
pierd semnificatia. La fel se ˆ
¸ ıntampl˘ cu secventa // ˆ comentarii care
a ¸ ın
incep cu /* sau */.
22. 1.4. TIPURI DE DATE SI VARIABILE
¸ 21
1.4 Tipuri de date ¸i variabile
s
1.4.1 Tipuri de date
In Java tipurile de date se impart ˆ dou˘ categorii: tipuri primitive ¸i
ın a s
tipuri referint˘. Java porne¸te de la premiza c˘ ”orice este un obiect”,
¸a s a
prin urmare tipurile de date ar trebui s˘ fie de fapt definite de clase ¸i toate
a s
variabilele ar trebui s˘ memoreze instante ale acestor clase (obiecte). In
a ¸
principiu acest lucru este adev˘rat, ˆ a, pentru usurinta program˘rii, mai
a ıns˘ ¸ a
exist˘ ¸i a¸a numitele tipurile primitive de date, care sunt cele uzuale :
as s
• aritmetice
–ˆ
ıntregi: byte (1 octet), short (2), int (4), long (8)
– reale: float (4 octeti), double (8)
• caracter: char (2 octeti)
¸
• logic: boolean (true ¸i false)
s
In alte limbaje de programare formatul ¸i dimensiunea tipurilor primitive de
s
date pot depinde de platforma pe care ruleaz˘ programul. In Java acest lucru
a
nu mai este valabil, orice dependent˘ de o anumit˘ platform˘ specific˘ fiind
¸a a a a
eliminat˘.
a
Vectorii, clasele ¸i interfetele sunt tipuri referint˘. Valoarea unei variabile
s ¸ ¸a
de acest tip este, spre deosebire de tipurile primitive, o referint˘ (adres˘ de
¸a a
memorie) c˘tre valoarea sau multimea de valori reprezentat˘ de variabila
a ¸ a
respectiv˘.
a
Exist˘ trei tipuri de date din limbajul C care nu sunt suportate de lim-
a
bajul Java. Acestea sunt: pointer, struct ¸i union. Pointerii au fost
s
eliminati din cauz˘ c˘ erau o surs˘ constant˘ de erori, locul lor fiind luat de
¸ a a a a
tipul referint˘, iar struct ¸i union nu ˆsi mai au rostul atˆt timp cˆt tipurile
¸a s ı¸ a a
compuse de date sunt formate ˆ Java prin intermediul claselor.
ın
23. 22 CAPITOLUL 1. INTRODUCERE ˆ JAVA
IN
1.4.2 Variabile
Variabilele pot fi de tip primitiv sau referinte la obiecte (tip referint˘). In-
¸ ¸a
diferent de tipul lor, pentru a putea fi folosite variabilele trebuie declarate ¸i,
s
eventual, initializate.
¸
• Declararea variabilelor: Tip numeVariabila;
• Initializarea variabilelor: Tip numeVariabila = valoare;
¸
• Declararea constantelor: final Tip numeVariabila;
Evident, exist˘ posibilitatea de a declara ¸i initializa mai multe variabile
a s ¸
sau constante de acela¸i tip ˆ
s ıntr-o singur˘ instructiune astfel:
a ¸
Tip variabila1[=valoare1], variabila2[=valoare2],...;
Conventia de numire a variabilelor ˆ Java include, printre altele, urm˘toarele
¸ ın a
criterii:
• variabilele finale (constante) se scriu cu majuscule;
• variabilele care nu sunt constante se scriu astfel: prima liter˘ mic˘ iar
a a
dac˘ numele variabilei este format din mai multi atomi lexicali, atunci
a ¸
primele litere ale celorlalti atomi se scriu cu majuscule.
¸
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";
In functie de locul ˆ care sunt declarate variabilele se ˆ
¸ ın ımpart ˆ urm˘toatele
ın a
categorii:
a. Variabile membre, declarate ˆ interiorul unei clase, vizibile pentru
ın
toate metodele clasei respective cˆt ¸i pentru alte clase ˆ functie de
a s ın ¸
nivelul lor de acces (vezi ”Declararea variabilelor membre”).
24. 1.4. TIPURI DE DATE SI VARIABILE
¸ 23
b. Parametri metodelor, vizibili doar ˆ metoda respectiv˘.
ın a
c. Variabile locale, declarate ˆ
ıntr-o metod˘, vizibile doar ˆ metoda re-
a ın
spectiv˘.
a
d. Variabile locale, declarate ˆ
ıntr-un bloc de cod, vizibile doar ˆ blocul
ın
respectiv.
e. Parametrii de la tratarea exceptiilor (vezi ”Tratarea exceptiilor”).
¸ ¸
class Exemplu {
//Fiecare variabila corespunde situatiei data de numele ei
//din enumerarea de mai sus
int a;
public void metoda(int b) {
a = b;
int c = 10;
for(int d=0; d < 10; d++) {
c --;
}
try {
a = b/c;
} catch(ArithmeticException e) {
System.err.println(e.getMessage());
}
}
}
Observatii:
• Variabilele declarate ˆ
ıntr-un for, r˘mˆn locale corpului ciclului:
a a
for(int i=0; i<100; i++) {
//domeniul de vizibilitate al lui i
}
i = 101;//incorect
• Nu este permis˘ ascunderea unei variabile:
a
25. 24 CAPITOLUL 1. INTRODUCERE ˆ JAVA
IN
int x=1;
{
int x=2; //incorect
}
1.5 Controlul executiei
¸
Instructiunile Java pentru controlul executiei sunt foarte asem˘n˘toare celor
¸ ¸ a a
din limbajul C ¸i pot fi ˆ artite ˆ urm˘toarele categorii:
s ımp˘ ¸ ın a
• Instructiuni de decizie: if-else, switch-case
¸
• Instructiuni de salt: for, while, do-while
¸
• Instructiuni pentru tratarea exceptiilor: try-catch-finally, throw
¸ ¸
• Alte instructiuni: break, continue, return, label:
¸
1.5.1 Instructiuni de decizie
¸
if-else
if (expresie-logica) {
...
}
if (expresie-logica) {
...
} else {
...
}
switch-case
switch (variabila) {
case valoare1:
...
break;
case valoare2:
26. 1.5. CONTROLUL EXECUTIEI
¸ 25
...
break;
...
default:
...
}
Variabilele care pot fi testate folosind instructiunea switch nu pot fi decˆt
¸ a
de tipuri primitive.
1.5.2 Instructiuni de salt
¸
for
for(initializare; expresie-logica; pas-iteratie) {
//Corpul buclei
}
for(int i=0, j=100 ; i < 100 && j > 0; i++, j--) {
...
}
Atˆt la initializare cˆt ¸i ˆ pasul de iteratie pot fi mai multe instructiuni
a ¸ a s ın ¸ ¸
desp˘rtite prin virgul˘.
a¸ a
while
while (expresie-logica) {
...
}
do-while
do {
...
}
while (expresie-logica);
27. 26 CAPITOLUL 1. INTRODUCERE ˆ JAVA
IN
1.5.3 Instructiuni pentru tratarea exceptiilor
¸ ¸
Instructiunile pentru tratarea exceptiilor sunt try-catch-finally, respectiv
¸ ¸
throw ¸i vor fi tratate ˆ capitolul ”Exceptii”.
s ın ¸
1.5.4 Alte instructiuni
¸
• break: p˘r˘se¸te fortat corpul unei structuri repetitive.
aa s ¸
• continue: termina fortat iteratia curent˘ a unui ciclu ¸i trece la urm˘toarea
¸ ¸ a s a
iteratie.
¸
• return [valoare]: termin˘ o metod˘ ¸i, eventual, returneaz˘ o valo-
a as a
rare.
• numeEticheta: : Define¸te o etichet˘.
s a
De¸i ˆ Java nu exist˘ goto, se pot defini totu¸i etichete folosite ˆ expresii
s ın a s ın
de genul: break numeEticheata sau continue numeEticheta, utile pentru
a controla punctul de ie¸ire dintr-o structur˘ repetitiv˘, ca ˆ
s a a ınexemplul de
mai jos:
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++;
}
1.6 Vectori
1.6.1 Crearea unui vector
Crearea unui vector presupune realizarea urm˘toarelor etape:
a
28. 1.6. VECTORI 27
• Declararea vectorului - Pentru a putea utiliza un vector trebuie, ˆ
ınainte
de toate, sa-l declar˘m. Acest lucru se face prin expresii de forma:
a
Tip[] numeVector; sau
Tip numeVector[];
ca ˆ exemplele de mai jos:
ın
int[] intregi;
String adrese[];
• Instantierea
¸
Declararea unui vector nu implic˘ ¸i alocarea memoriei necesare pentru
as
retinerea elementelor. Operatiunea de alocare a memoriei, numit˘ ¸i
¸ ¸ a s
instantierea vectorului, se realizeaz˘ ˆ
¸ a ıntotdeauna prin intermediul op-
eratorului new. Instantierea unui vector se va face printr-o expresie de
¸
genul:
numeVector = new Tip[nrElemente];
unde nrElemente reprezint˘ num˘rul maxim de elemente pe care le
a a
poate avea vectorul. In urma instantierii vor fi alocati: nrElemente ∗
¸ ¸
dimensiune(T ip) octeti necesari memor˘rii elementelor din vector, unde
¸ a
prin dimensiune(T ip) am notat num˘rul de octeti pe care se reprezint˘
a ¸ a
tipul respectiv.
v = new int[10];
//aloca spatiu pentru 10 intregi: 40 octeti
c = new char[10];
//aloca spatiu pentru 10 caractere: 20 octeti
Declararea ¸i instantierea unui vector pot fi f˘cute simultan astfel:
s ¸ a
Tip[] numeVector = new Tip[nrElemente];
29. 28 CAPITOLUL 1. INTRODUCERE ˆ JAVA
IN
• Initializarea (optional) Dup˘ declararea unui vector, acesta poate fi
¸ ¸ a
initializat, adic˘ elementele sale pot primi ni¸te valori initiale, evident
¸ a s ¸
dac˘ este cazul pentru a¸a ceva. In acest caz instantierea nu mai trebuie
a s ¸
facut˘ explicit, alocarea memoriei f˘cˆndu-se automat ˆ functie de
a a a ın ¸
num˘ rul de elemente cu care se initializeaz˘ vectorul.
a ¸ a
String culori[] = {"Rosu", "Galben", "Verde"};
int []factorial = {1, 1, 2, 6, 24, 120};
Primul indice al unui vector este 0, deci pozitiile unui vector cu n ele-
¸
ıntre 0 ¸i n − 1. Nu sunt permise constructii de genul
mente vor fi cuprinse ˆ s ¸
Tip numeVector[nrElemente], alocarea memoriei f˘cˆndu-se doar prin in-
a a
termediul opearatorului new.
int v[10]; //ilegal
int v[] = new int[10]; //corect
1.6.2 Tablouri multidimensionale
In Java tablourile multidimensionale sunt de fapt vectori de vectori. De
exemplu, crearea ¸i instantierea unei matrici vor fi realizate astfel:
s ¸
Tip matrice[][] = new Tip[nrLinii][nrColoane];
matrice[i] este linia i a matricii ¸i reprezint˘ un vector cu nrColoane
s a
elemente iar matrice[i][j] este elementul de pe linia i ¸i coloana j.
s
1.6.3 Dimensiunea unui vector
Cu ajutorul variabilei length se poate afla num˘rul de elemente al unui
a
vector.
int []a = new int[5];
// a.length are valoarea 5
int m[][] = new int[5][10];
// m[0].length are valoarea 10
Pentru a ˆ ¸elege modalitatea de folosire a lui length trebuie mentionat c˘
ınt ¸ a
fiecare vector este de fapt o instant˘ a unei clase iar length este o variabil˘
¸a a
public˘ a acelei clase, ˆ care este retinut num˘rul maxim de elemente al
a ın ¸ a
vectorului.
30. 1.6. VECTORI 29
1.6.4 Copierea vectorilor
Copierea elementelor unui vector a ˆıntr-un alt vector b se poate face, fie
element cu element, fie cu ajutorul metodei System.arraycopy, ca ˆ exem-
ın
plele de mai jos. Dup˘ cum vom vedea, o atribuire de genul b = a are alt˘
a a
semnificatie decˆt copierea elementelor lui a ˆ b ¸i nu poate fi folosit˘ ˆ
¸ a ın s a ın
acest scop.
int a[] = {1, 2, 3, 4};
int b[] = new int[4];
// Varianta 1
for(int i=0; i<a.length; i++)
b[i] = a[i];
// Varianta 2
System.arraycopy(a, 0, b, 0, a.length);
// Nu are efectul dorit
b = a;
1.6.5 Sortarea vectorilor - clasa Arrays
In Java s-a pus un accent deosebit pe implementarea unor structuri de date
¸i algoritmi care s˘ simplifice proceseul de crearea a unui algoritm, program-
s a
atorul trebuind s˘ se concentreze pe aspectele specifice problemei abordate.
a
Clasa java.util.Arrays ofer˘ diverse metode foarte utile ˆ lucrul cu vec-
a ın
tori cum ar fi:
• sort - sorteaz˘ ascendent un vector, folosind un algoritm de tip Quick-
a
Sort performant, de complexitate O(n log(n)).
int v[]={3, 1, 4, 2};
java.util.Arrays.sort(v);
// Sorteaza vectorul v
// Acesta va deveni {1, 2, 3, 4}
• binarySearch - c˘utarea binar˘ a unei anumite valori ˆ
a a ıntr-un vector
sortat;
31. 30 CAPITOLUL 1. INTRODUCERE ˆ JAVA
IN
• equals - testarea egalit˘¸ii valorilor a doi vectori (au acelea¸i num˘r
at s a
de elemente ¸i pentru fiecare indice valorile corespunz˘toare din cei doi
s a
vectori sunt egale)
• fill - atribuie fiec˘rui element din vector o valoare specificat˘.
a a
1.6.6 Vectori cu dimensiune variabil˘ ¸i eterogeni
as
Implement˘ri ale vectorilor cu num˘r variabil de elemente sunt oferite de
a a
clase specializate cum ar fi Vector sau ArrayList din pachetul java.util.
Astfel de obiecte descriu vectori eterogeni, ale c˘ror elemente au tipul Object,
a
¸i vor fi studiati ˆ capitolul ”Colectii”.
s ¸ ın ¸
1.7 Siruri de caractere
¸
In Java, un ¸ir de caractere poate fi reprezentat printr-un vector format
s
din elemente de tip char, un obiect de tip String sau un obiect de tip
StringBuffer.
Dac˘ un ¸ir de caractere este constant (nu se dore¸te schimbarea continutului
a s s ¸
s˘ pe parcursul executiei programului) atunci el va fi declarat de tipul String,
a ¸
altfel va fi declarat de tip StringBuffer. Diferenta principal˘ ˆ
¸ a ıntre aceste
clase este c˘ StringBuffer pune la dispozitie metode pentru modificarea
a ¸
continutului ¸irului, cum ar fi: append, insert, delete, reverse.
¸ s
Uzual, cea mai folosit˘ modalitate de a lucra cu ¸iruri este prin intermediul
a s
clasei String, care are ¸i unele particularit˘¸i fat˘ de restul claselor menite s˘
s at ¸a a
simplifice cˆt mai mult folosirea ¸irurilor de caractere. Clasa StringBuffer
a s
va fi utilizat˘ predominant ˆ aplicatii dedicate proces˘rii textelor cum ar fi
a ın ¸ a
editoarele de texte.
Exemple echivalente de declarare a unui ¸ir:s
String s = "abc";
String s = new String("abc");
char data[] = {’a’, ’b’, ’c’};
String s = new String(data);
Observati prima variant˘ de declarare a ¸irului s din exemplul de mai sus
¸ a s
- de altfel, cea mai folosit˘ - care prezint˘ o particularitate a clasei String
a a
fata de restul claselor Java referitoare la instantierea obiectelor sale.
¸ ¸
32. ˘
1.8. FOLOSIREA ARGUMENTELOR DE LA LINIA DE COMANDA 31
Concatenarea ¸irurilor de caractere se face prin intermediul operatorului
s
+ sau, ˆ cazul ¸irurilor de tip StringBuffer, folosind metoda append.
ın s
String s1 = "abc" + "xyz";
String s2 = "123";
String s3 = s1 + s2;
In Java, operatorul de concatenare + este extrem de flexibil, ˆ sensul c˘
ın a
permite concatenarea ¸irurilor cu obiecte de orice tip care au o reprezentare
s
de tip ¸ir de caractere. Mai jos, sunt cˆteva exemple:
s a
System.out.print("Vectorul v are" + v.length + " elemente");
String x = "a" + 1 + "b"
Pentru a l˘muri putin lucrurile, ceea ce execut˘ compilatorul atunci cˆnd
a ¸ a a
ˆ alne¸te o secvent˘ de genul String x = "a" + 1 + "b" este:
ıntˆ s ¸a
String x = new StringBuffer().append("a").append(1).
append("b").toString()
Atentie ˆ a la ordinea de efectuare a operatiilor. Sirul s=1+2+"a"+1+2
¸ ıns˘ ¸ ¸
va avea valoarea "3a12", primul + fiind operatorul matematic de adunare
iar al doilea +, cel de concatenare a ¸irurilor.
s
1.8 Folosirea argumentelor de la linia de co-
mand˘ a
1.8.1 Transmiterea argumentelor
O aplicatie Java poate primi oricˆte argumente de la linia de comanda ˆ
¸ a ın
momentul lans˘rii ei. Aceste argumente sunt utile pentru a permite utiliza-
a
torului s˘ specifice diverse optiuni legate de functionarea aplicatiei sau s˘
a ¸ ¸ ¸ a
furnizeze anumite date initiale programului.
¸
Atentie
¸
Programele care folosesc argumente de la linia de comand˘ nu sunt 100%
a
pure Java, deoarece unele sisteme de operare, cum ar fi Mac OS, nu au ˆ ın
mod normal linie de comand˘.a
33. 32 CAPITOLUL 1. INTRODUCERE ˆ JAVA
IN
Argumentele de la linia de comand˘ sunt introduse la lansarea unei aplicatii,
a ¸
fiind specificate dup˘ numele aplicatiei ¸i separate prin spatiu. De exemplu,
a ¸ s ¸
s˘ presupunem c˘ aplicatia Sortare ordoneaz˘ lexicografic (alfabetic) liniile
a a ¸ a
unui fi¸ier ¸i prime¸te ca argument de intrare numele fi¸ierului pe care s˘
s s s s a
ˆ sorteze. Pentru a ordona fi¸ierul "persoane.txt", aplicatia va fi lansat˘
ıl s ¸ a
astfel:
java Sortare persoane.txt
A¸adar, formatul general pentru lansarea unei aplicatii care prime¸te argu-
s ¸ s
mente de la linia de comand˘ este:
a
java NumeAplicatie [arg0 arg1 . . . argn]
In cazul ˆ care sunt mai multe, argumentele trebuie separate prin spatii
ın ¸
iar dac˘ unul dintre argumente contine spatii, atunci el trebuie pus ˆ
a ¸ ¸ ıntre
ghilimele. Evident, o aplicatie poate s˘ nu primeasc˘ nici un argument sau
¸ a a
poate s˘ ignore argumentele primite de la linia de comand˘.
a a
1.8.2 Primirea argumentelor
In momentul lans˘rii unei aplicatii interpretorul parcurge linia de comand˘ cu
a ¸ a
care a fost lansat˘ aplicattia ¸i, ˆ cazul ˆ care exist˘, transmite programului
a ¸ s ın ın a
argumentele specificate sub forma unui vector de ¸iruri. Acesta este primit
s
de aplicatie ca parametru al metodei main. Reamintim c˘ formatul metodei
¸ a
main din clasa principal˘ este:
a
public static void main (String args[])
Vectorul args primit ca parametru de metoda main va contine toate argu-
¸
mentele transmise programului de la linia de comand˘.
a
In cazul apelului java Sortare persoane.txt vectorul args va contine un
¸
singur element pe prima s˘ pozitie: args[0]="persoane.txt".
a ¸
Vectoru args este instantiat cu un num˘r de elemente egal cu num˘rul ar-
¸ a a
gumentelor primite de la linia de comand˘. A¸adar, pentru a afla num˘rul de
a s a
argumente primite de program este suficient s˘ afl˘m dimensiunea vectorului
a a
args prin intermediul atributului length:
34. ˘
1.8. FOLOSIREA ARGUMENTELOR DE LA LINIA DE COMANDA 33
public static void main (String args[]) {
int numarArgumente = args.length ;
}
In cazul ˆ care aplicatia presupune existenta unor argumente de la linia
ın ¸ ¸
de comand˘, ˆ a acestea nu au fost transmise programului la lansarea sa, vor
a ıns˘
ap˘rea exceptii (erori) de tipul ArrayIndexOutOfBoundsException. Tratarea
a ¸
acestor exceptii este prezentat˘ ˆ capitolul ”Exceptii”.
¸ a ın ¸
Din acest motiv, este necesar s˘ test˘m dac˘ programul a primit argumentele
a a a
de la linia de comand˘ necesare pentru functionarea sa ¸i, ˆ caz contrar, s˘
a ¸ s ın a
afi¸eze un mesaj de avertizare sau s˘ foloseasc˘ ni¸te valori implicite, ca ˆ
s a a s ın
exemplul de mai jos:
public class Salut {
public static void main (String args[]) {
if (args.length == 0) {
System.out.println("Numar insuficient de argumente!");
System.exit(-1); //termina aplicatia
}
String nume = args[0]; //exista sigur
String prenume;
if (args.length >= 1)
prenume = args[1];
else
prenume = ""; //valoare implicita
System.out.println("Salut " + nume + " " + prenume);
}
}
Spre deosebire de limbajul C, vectorul primit de metoda main nu contine¸
pe prima pozitie numele aplicatiei, ˆ
¸ ¸ ıntrucˆt ˆ Java numele aplicatiei este
a ın ¸
chiar numele clasei principale, adic˘ a clasei ˆ care se gase¸te metoda main.
a ın s
S˘ consider˘ ˆ continuare un exemplu simplu ˆ care se dore¸te afi¸area
a a ın ın s s
pe ecran a argumentelor primite de la linia de comand˘: a
public class Afisare {
public static void main (String[] args) {
for (int i = 0; i < args.length; i++)
System.out.println(args[i]);
35. 34 CAPITOLUL 1. INTRODUCERE ˆ JAVA
IN
}
}
Un apel de genul java Afisare Hello Java va produce urm˘torul rezul-
a
tat (aplicatia a primit 2 argumente):
¸
Hello
Java
Apelul java Afisare "Hello Java" va produce ˆ a alt rezultat (aplicatia
ıns˘ ¸
a primit un singur argument):
Hello Java
1.8.3 Argumente numerice
Argumentele de la linia de comand˘ sunt primite sub forma unui vector de
a
¸iruri (obiecte de tip String). In cazul ˆ care unele dintre acestea reprezint˘
s ın a
valori numerice ele vor trebui convertite din ¸iruri ˆ numere. Acest lucru
s ın
se realizeaz˘ cu metode de tipul parseTipNumeric aflate ˆ clasa corespun-
a ın
zatoare tipului ˆ care vrem s˘ facem conversia: Integer, Float, Double,
ın a
etc.
S˘ consider˘m, de exemplu, c˘ aplicatia Power ridic˘ un numar real la o
a a a ¸ a
putere ˆıntreag˘, argumentele fiind trimise de la linia de comand˘ sub forma:
a a
java Power "1.5" "2" //ridica 1.5 la puterea 2
Conversia celor dou˘ argumente ˆ numere se va face astfel:
a ın
public class Power {
public static void main(String args[]) {
double numar = Double.parseDouble(args[0]);
int putere = Integer.parseInt(args[1]);
System.out.println("Rezultat=" + Math.pow(numar, putere));
}
}
Metodele de tipul parseTipNumeric pot produce exceptii (erori) de tipul
¸
NumberFormatException ˆ cazul ˆ care ¸irul primit ca parametru nu reprezint˘
ın ın s a
un numar de tipul respectiv. Tratarea acestor exceptii este prezentat˘ ˆ
¸ a ın
capitolul ”Exceptii”.
¸
36. Capitolul 2
Obiecte ¸i clase
s
2.1 Ciclul de viat˘ al unui obiect
¸a
2.1.1 Crearea obiectelor
In Java, ca ˆ orice limbaj de programare orientat-obiect, crearea obiectelor
ın
se realizeaz˘ prin instantierea unei clase ¸i implic˘ urm˘toarele lucruri:
a ¸ s a a
• Declararea
Presupune specificarea tipului acelui obiect, cu alte cuvinte specificarea
clasei acestuia (vom vedea c˘ tipul unui obiect poate fi ¸i o interfat˘).
a s ¸a
NumeClasa numeObiect;
• Instantierea
¸
Se realizeaz˘ prin intermediul operatorului new ¸i are ca efect crearea
a s
efectiv˘ a obiectului cu alocarea spatiului de memorie corespunz˘tor.
a ¸ a
numeObiect = new NumeClasa();
• Initializarea
¸
Se realizeaz˘ prin intermediul constructorilor clasei respective. Initializarea
a ¸
este de fapt parte integrant˘ a procesului de instantiere, ˆ sensul c˘
a ¸ ın a
imediat dup˘ alocarea memoriei ca efect al operatorului new este apelat
a
constructorul specificat. Parantezele rotunde de dup˘ numele clasei in-
a
dic˘ faptul c˘ acolo este de fapt un apel la unul din constructorii clasei
a a
¸i nu simpla specificare a numelui clasei.
s
Mai general, instantierea ¸i initializarea apar sub forma:
¸ s ¸
35