Intrebari Java
Intrebari Java
Java este un limbaj de programare cu larga utilizare ce permite sa scriem aplicatii indifferent de domeniul
de utilizare.
Din punct de vedere al modului de acces, datele si metodele unei clase pot fi publice sau private. Cele
publice sunt accesibile din orice alta clasa, in timp ce cele private sunt accesibile numai din clasa careia ii
apartin.
class <nume_clasa> {
public static void main(String args[]) {
// corpul metodei main
}
}
1.
Pe ecran apare din nou promptul sistemului de operare, fr a se afia un mesaj de eroare. n acest
caz, compilarea a decurs normal, iar dac dai comanda dir vei constata ca n subdirectorul curent a
aprut un nou fiier, care poart numele clasei i extensia class. Acesta este fiierul care conine
bytecode-ul clasei compilate.
2.
Obinei un mesaj de eroare, care indic fie c exist erori n program, care au fost sesizate de
compilator, fie c exist erori n linia de comand prin care ai cerut compilarea. n ambele cazuri,
este necesar s eliminai erorile i s reluai compilarea.
Executarea aplicatiei
Dac n directorul curent exist fiierul <nume_aplicaie>.class, executarea acestei aplicaii se solicit prin
comanda
java <nume_aplicaie>
Remarcm c se d ca parametru numai numele clasei, fr extensia class. Efectul acestei comenzi este, fie
executarea aplicatiei, fie aparitia unui mesaj de eroare de execuie.
Prin comanda java se pune n execuie interpretorul mainii virtuale Java. Acest interpretor verific dac n
directorul curent exist fiierul <nume_aplicaie>.class. Daca acesta exist, ncarc n memorie codul de
octei pe care l conine i pune n execuie metoda public static void main(). Dac fiierul nu exist, sau dac
el nu conine o astfel de metod, se semnaleaz printr-un mesaj de eroare.
iruri de caractere
irul se reprezint n program printr-o succesiune de caractere cuprins ntre ghilimele. Iat cteva exemple
de iruri:
"sir de caractere"
"ABCDefgh"
"1A23bc7"
"*+_/?"
""
Ultimul exemplu este un ir vid (care nu conine nici un caracter).
Identificatori
Numele date programelor sau componentelor acestora (clase, variabile, metode etc.) se numesc identificatori.
Identificatorii se aleg de ctre programator, respectnd anumite reguli.
n limbajul Java, identificatorii sunt iruri formate din litere, cifre i caractere de subliniere ('_'), care ncep
cu o liter. Lungimea identificatorului nu prezint importan, ns acesta nu poate conine spaii libere sau
alte caractere, dect cele menionate aici.
Cuvinte cheie
n orice limbaj de programare, exist un set de cuvinte, numite cuvinte cheie, care sunt considerate
simboluri sintactice i nu pot fi folosite n program ca identificatori.
n limbajul Java, exist urmtoarele cuvinte cheie :
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
Dintre acestea, const i goto nu sunt folosite n prezent, dar ele au fost introduse n tabela cuvintelor cheie
n vederea unei eventuale utilizri viitoare.
Observm acum c toate exemplele de cuvinte cheie date la nceputul acestei seciuni (class, public, static,
void) sunt prezente n tabela de mai sus.
Cuvinte rezervate
Se consider cuvinte rezervate acele cuvinte, care nu pot fi folosite ca identificatori, avnd semnificaii
speciale. Cuvintele cheie sunt i ele considerate n majoritatea limbajelor, inclusiv Java, drept cuvinte
rezervate. n afar de acestea, n limbajul Java exist urmatoarele cuvinte rezervate: true, false, null.
Primele dou sunt valorile logice adevrat i fals, iar al treilea are semnificaia de referin nul. De fapt,
aceste cuvinte rezervate sunt forme speciale de literali.
Literali
Literalii sunt reprezentrile n fiierele surs ale valorilor constante. Exemple de literali:
- caractere: 'a', 'A', '+', '$', '5';
- iruri de caractere: "sir de caractere", "abc$79.28#^z";
- numere ntregi: 14726, -25413;
- numere reale: 12.7389, -0.05673, 2.3075E12, -1.4237E-5;
- valori logice: true, false;
- referina nul: null.
Am subliniat faptul c literalul este forma sub care o anumita valoare este reprezentat n fiierul
surs, deci n programul scris n limbaj de nivel superior (n cazul nostru n limbajul Java). Vom arta
ulterior c forma de reprezentare a acelorai valori n memoria intern a calculatorului (forma intern)
este diferit de cea extern. Vom reveni asupra regulilor de scriere a literalilor cnd vom prezenta
tipurile de date din limbajul Java.
Separatori
Separatorul este un caracter care delimiteaz formele sintactice sau le separ ntre ele. n limbajul Java
se folosesc urmtorii separatori:
{ } ( ) [ ] ; , .
Spaiul liber i operatorii indeplinesc, de asemenea, rolul de separatori.
Aproape toi aceti separatori au fost deja folosii n exemplele date n acest capitol.
Operatori
Operatorii sunt simboluri ale unor operaii. Am folosit deja simbolul + ca operator de concatenare
(deci simbol al operaiei de concatenare). Operatorul poate fi format din unul sau mai multe caractere.
Entitatea asupra creia se aplic operatorul se numete operand. Dup numrul de operanzi, operatorii
pot fi unari, binari sau ternari.
Din punct de vedere matematic, operatorii sunt funcii cu unul, dou sau trei argumente (argumentele
fiind operanzii). De exemplu, expresia a+b, n care + este un operator binar, iar a i b sunt operanzi,
este o funcie de argumente a si b, care are ca valoare suma valorilor celor dou argumente.
Dup efectul operatorului asupra operanzilor, operatorii pot fi fr efect lateral, care lasa valorile
operanzilor nemodificate, i cu efect lateral, care modific valorile operanzilor. Astfel, operatorul + din
exemplul anterior, este un operator fr efect lateral. n schimb, n expresia ++a operatorul de
incrementare ++ are efect lateral deoarece, n urma efectuarii operaiei, valoarea operandului a crete
cu o unitate.
Spaii
ntre unitile lexicale ale programului pot fi introduse orict de multe spaii libere, fr ca acestea s
aib influen asupra sintaxei sau semanticii programului. Mai multe spaii libere succesive sunt tratate
de compilator ca i cnd ar fi un singur spaiu
Variabile
In matematic, variabila este un simbol dat unei valori, care aparine unei mulimi de valori ce
constituie domeniul de definiie al variabilei respective.
n programare, variabila este un nume cruia i se asociaz o valoare. Numele variabilei este un
identificator, iar valoarea variabilei trebuie s aparin unui anumit tip de date. Asupra valorilor
variabilelor pot fi efectuate prin program anumite operaii.
Valoarea variabilei trebuie s fie reprezentat n memoria calculatorului la o anumit adres i s
ocupe acolo un anumit spaiu (un anumit numr de bii). n consecin, numim variabil o zon de
memorie care poarta un nume i care conine o anumit valoare, apartinnd unui tip de date .
Programatorul care folosete un limbaj de nivel nalt, cum este i limbajul Java, nu trebuie s cunoasc
adresa de memorie, la care este plasat valoarea variabilei, i nici reprezentarea intern a acesteia, fiind
suficient s-i cunoasca numele i tipul. Alocarea de spaiu n memorie pentru fiecare variabil se face,
dup caz, de ctre compilator sau interpretor. n schimb, numele i tipul variabilei trebuie declarate de
ctre programator.
Remarcm c n matematic operaiile cu variabile se fac, de cele mai multe ori, la nivel abstract,
asupra simbolurilor variabilelor i nu asupra valorilor acestora. De exemplu, n identitatea a+a=2.a nu
are importana ce valoare are variabila a, egalitatea fiind ntotdeauna adevarat.
n programare se are n vedere faptul c, att timp ct ea exista n memorie, variabila are ntotdeauna
o valoare (deoarece zona de memorie aferent nu poate fi vid), iar operaiile se fac asupra valorilor
variabilelor i nu asupra numelor acestora.
declaraia de tip este o instructiune care se termin obligatoriu prin simbolul ; (punct i virgul);
este posibil ca, ntr-o singur declaraie, s apar mai multe variabile; n acest caz, specificaiile
variabilelor respective sunt separate prin virgule;
n declaraia de tip, valoarea iniial a variabilei poate fi dat sub forma unui literal sau a unei expresii. n
ultimul caz, este necesar ca expresia s fie calculabil, deci toate variabilele pe care le conine s aiba deja
valori date anterior.
Prin convenie, n limbajul Java numele de variabile ncep ntotdeauna cu liter mic . Este permis ns ca, n
interiorul numelui, sa existe i litere mari. Aceasta se ntampl atunci cnd numele variabilei este format din
mai multe cuvinte ale limbii naturale, de exemplu vitezaMedie.
Variabile finale
n limbajul Java, se numesc variabile finale acele "variabile", ale cror valori nu pot fi modificate prin
program. Acestea sunt deci, de fapt, nite constante cu nume. Ele se aseamn cu variabilele propriuzise prin faptul c sunt tot perechi nume - valoare, numai c valoarea lor se d o singur dat, sub
forma de iniializare n declaraia de tip sau sub forma de atribuire, dup care nu mai poate fi
modificat. Se obinuiete ca numele de variabile finale s fie scrise n ntregime cu majuscule.
Declaraia de tip este la fel cu cea pentru variabile obinuite, dar are in fa modificatorul final, care
este un cuvnt cheie.
De exemplu, declaraia
final int ALPHA=17, BETA=-1453;
servete pentru a specific faptul c ALPHA i BETA sunt variabile finale de tip int, ale caror valori sunt,
respectiv, 17 si -1453 i nu mai pot fi ulterior modificate (deci ALPHA i BETA sunt, de fapt, nite
constante).
Tipuri de date
Tipul de date este unul din conceptele fundamentale ale programrii calculatoarelor. Tipul de date este
o mulime de valori, asociat cu o mulime de operaii care se pot face asupra valorilor respective.
n limbajul Java, tipurile de date se mpart n dou categorii: tipuri primitive i tipuri referin.
tipul boolean;
tipurile numerice
o
tipul char
Operaia de comparare
Comparaiile sunt operaii binare fr efect lateral , n care se compar dou numere, obinndu-se ca
rezultat o valoare de tip boolean. Operatorii prin care se efectueaz comparaia a dou numere se
numesc operatori relaionali i sunt dai n tabela de mai jos.
Operator
Semnificatie
<
<=
>
>=
==
este egal cu
!=
este diferit de
Operaii aritmetice
Operaiile aritmetice sunt cele care se aplic unor operanzi numerici, avnd ca rezultate tot numere.
Dup numrul de operanzi, ele pot fi unare sau binare. Unele operaii aritmetice unare au i efect
lateral.
Tipul rezultatului operaiilor aritmetice depinde de tipul operanzilor i va fi discutat la fiecare din
tipurile numerice n parte.
n exemplele de expresii din aceast seciune, vom considera c a i b sunt doi operanzi numerici .
n limbajul Java exist urmtorii operatori aritmetici:
Operatori unari fr efect lateral:
Operator
Exemplu de expresie
Valoarea expresiei
+a
-a
Operator
Expresie
Operatie
Valoarea expresiei
Efect lateral
++
++a
preincrementare
a+1
++
a++
postincrementare
--
--a
predecrementare
a-1
--
a--
postdecrementare
Operator
Expresie
Operatie
Valoarea expresiei
a+b
adunare
a-b
scadere
a*b
inmultire
a/b
impartire
a%b
modulo
Prin mprire ntreag nelegem mprirea fcut astfel, nct ctul sa fie un numr ntreg (fr
extragerea prii fracionare (situate dupa virgul).
Operator
Expresie
Efect
<<
a<<s
>>
a>>s
10
>>>
a>>>s
Precedenta operatorilor
La evaluarea unei expresii, prezinta o importan deosebit ordinea n care se aplic operatorii pe care i
conine, deoarece de aceast ordine poate s depind valoarea expresiei. n toate limbajele de programare, n
care se folosesc expresii, se stabilesc i anumite reguli de preceden i de asociativitate, pe baza crora se
stabilete ordinea de evaluare.
Fiecrui operator i se asociaz o preceden, adic un nivel de prioritate n aplicarea operatorului respectiv.
De exemplu, n expresia a+b*c operatorul * se va aplica naintea operatorului +, deoarece are precedena
superioar. n consecin, aceasta expresie se va calcula ca i cnd ar fi scris sub forma a+(b*c).
n limbajul Java, la stabilirea ordinii operaiilor se aplica urmtoarele reguli:
- operatorii unari se aplic naintea celor binari;
- expresiile din interiorul parantezelor se evalueaz naintea celor din exterior;
- dac, ntr-o expresie, toi operatorii au acelai nivel de preceden, ei se aplic de la stnga la dreapta;
- operanzii unui operator se evalueaza nainte de a se aplica operatorul respectiv (deci operatorul se aplic
ntotdeauna asupra valorilor operanzilor si); dac operaia este binar, operandul din partea stng se
evalueaz naintea celui din partea dreapt;
- nivelul de preceden al operatorilor se stabilete conform cu tabela de mai jos, n care:
11
operand2 i operand3 - expresii de tipuri compatibile: fie ambii operanzi de tip boolean, fie ambii de
tipuri numerice, fie ambii de tipuri referin.
Evaluarea expresiei decurge astfel:
- se evalueaz operand1 obinndu-se o valoare boolean;
- dac operand1 are valoarea true, atunci valoarea expresiei condiionale este cea care se obine
evalund operand2; altfel, este cea care se obine evalund operand3.
Instruciunea
n limbajul Java, procesul de calcul este controlat de instruciuni (enunuri). Fiecare instruciune indic una
sau mai multe aciuni pe care trebuie s le execute calculatorul. Corpul oricrei metode este constituit dintr-o
succesiune de instruciuni. Executarea metodei const n executarea acestor instruciuni ntr-o ordine
determinat. Instruciunile pot fi grupate n blocuri.
Dup structura lor, instruciunile pot fi simple sau structurate.
Instruciunile simple nu conin n interiorul lor alte instruciuni. Exist trei categorii principale de
instruciuni (enunuri) simple: declaraiile de variabile locale, instruciunile-expresie i instruciunea vid. La
scrierea lor se respect urmtoarele reguli:
toate instruciunile simple se termin cu caracterul ';' (punct i virgul). Instruciunea vid este
format numai din acest caracter;
declaraiile de variabile locale servesc pentru a specifica tipul, numele i (opional) valoarea iniial
a variabilelor. Forma sintactic i utilizarea declaraiilor au fost prezentate anterior;
instruciunile-expresie sunt formate dintr-o expresie de atribuire, de incrementare/decrementare sau
de invocare de metod, urmat de caracterul ';'.
Not pentru programatorii n alte limbaje
n limbajul Java, declaraiile de variabile locale sunt considerate instruciuni executabile, deci ele au efect
la executarea programului.
n majoritatea limbajelor compilate, declaraiile de variabile locale sunt luate n consideraie numai la
compilare, deci sunt considerate instruciuni neexecutabile. n limbajul Java declaraiile sunt, de asemenea,
luate n consideraie de compilator, care verific dac declaraia este corect sintactic i, de asemenea,
verific la fiecare apariie a unei variabile locale n programul surs dac:
- variabila respectiv a fost declarat;
- tipul variabilei corespunde contextului n care este folosit variabila respectiv;
- variabila are deja o valoare.
12
1. Teorema de structur : orice program poate fi ntocmit folosind numai trei structuri de control
fundamentale: structura secvenial, structura alternativ i structura repetitiv.
2. La conceperea programelor se recomand s se aplice tehnica de elaborare descendent (n
englez Top-Down), numit i tehnica rafinrilor succesive.
3. Domeniile de valabilitate (de vizibilitate) ale variabilelor i structurilor de date trebuie s fie
limitate.
n limbajul Java, pentru rezolvarea problemei realizrii creterii eficienei muncii programatorilor s-a
adoptat concepia modern a programrii orientate pe obiecte. In consecin, modulele de program sunt
mici i rolul programrii structurate este sensibil redus. Totui, fiecare metod din limbajul Java este
un mic program, la elaborarea cruia se aplic principiile programrii structurate , ceeace s-a avut n
vedere i la adoptarea instruciunilor de baz oferite de acest limbaj. Este deci util ca i programatorii
n Java sa cunoasc principiile fundamentale ale programrii structurate.
Structura secveniala
Blocul este o secven de instruciuni cuprins ntre acolade. Forma sintactic a blocului este, deci,
urmtoarea:
{
secven_de_instruciuni
}
unde secven_de_instruciuniconst dintr-un numr oarecare de instruciuni succesive, putnd fi i
vid. Instruciunile din aceast secven pot fi att simple, ct i structurate, inclusiv alte blocuri.
Din punct de vedere al programrii structurate, blocul este realizarea structurii de control secveniale.
Aceasta inseamn c instruciunile dintr-un bloc se execut una dupa alta, n ordinea n care ele sunt
scrise n program. Tocmai de aceea se i folosete termenul secven de instruciuni pentru a indica ce
conine blocul.
Instruciunea if
Instruciunea if servete pentru realizarea structurii alternative din programarea structurat. Sub forma ei cea
mai simpl, aceast instruciune se scrie astfel:
if(expresie_boolean) instruciune
unde instruciune poate fi orice instruciune valabil n limbajul Java: instruciune simpl sau structurat,
inclusiv un bloc sau un alt if. Remarcm c n forma general de mai sus nu am pus la sfrit caracterul ';'
(punct i virgul). Dac instruciune este o instruciune simpl, ea include i acest simbol.
Semnificaia instruciunii if este urmtoarea: dac valoarea expresiei booleene din parantez este true, atunci
se execut instruciune, iar altfel nu se execut nimic, continundu-se programul.
Instructiunea if .. else
Instruciunea if .. else realizeaz ambele ramuri ale structurii alternative i are forma
if(expresie_boolean)
instruciune_1
else
instruciune_2
13
Instructiunea switch
n limbajul Java, structura de comutare se realizeaz prin instruciunea switch, care are urmtoarea
form general:
switch (expresie) {
case valoare_1: secven_1
[break;]
case valoare_2: secven_2
[break;]
..........................
case valoare_N: secven_N
[default: secven ]
}
n care:
- switch, case si default sunt cuvinte cheie ale limbajului Java;
- expresie este o expresie de tip byte, short, int sau char;
- valoare este fie un literal de tip byte, short, int sau char, fie o expresie constant de tip int, adic o
expresie care conine numai literali sau variabile finale din tipurile menionate;
- secvena este o secven de instruciuni simple sau structurate;
- parantezele drepte roii []nu apar n program, ci indic faptul c coninutul lor este opional (poate
sa lipseasc).
n limba englez, switch nseamn comutator. Conform acestei forme generale, dup cuvantul cheie
switch, exist o expresie de tip int sau compatibil cu aceasta (deci poate fi i de tip char, byte sau
short, dar nu de tip long), a crei valoare servete drept "comutator". Se deschide apoi acolada corpului
instruciunii, n care exist mai multe "cazuri". Fiecare "caz" ncepe prin cuvantul cheie case, urmat de
o valoare de tip ntreg, dup care apar una sau mai multe instruciuni (simple sau compuse) i opional
intruciunea break. Dup ce s-au epuizat toate cazurile, opional se poate scrie cuvntul cheie default
urmat de una sau mai multe instruciuni. La sfrit, se nchide acolada corpului instruciunii switch.
Executarea instruciunii switch decurge astfel: se evalueaz mai nti expresie i se obine o valoare de
tip ntreg, care servete drept comutator. Aceast valoare se compar, pe rnd de sus n jos, cu fiecare
din valorile indicate dup cuvintele cheie case, pn cnd se gsete prima valoare care coincide cu
cea a comutatorului. Dac s-a gsit o astfel de valoare, se execut toate instruciunile care ncep de la
cazul respectiv, pn la prima instruciune break ntalnit sau, n lipsa acesteia, pn la acolada de
nchidere a corpului instruciunii switch. Dac ns nici unul din cazuri nu conine valoarea potrivit a
comutatorului, atunci se execut instruciunile care urmeaz dup cuvntul cheie default sau, n lipsa
acestuia, nu se execut nimic.
14
n unele limbaje de programare, pentru realizarea ciclurilor la care numrul de pai este dinainte
cunoscut, se folosete o instruciune de control special, numit "ciclu cu contor". n pseudocod,
aceast instruciune poate fi scris n modul urmtor:
pentru variabila de_la val_init la val_fin [cu_pasul pas] execut
<instruciune sau secven de instruciuni>
sfrit_ciclu
15
n care, de regul, variabila este o variabil (de regul de tip ntreg), numit i contorul ciclului,
val_init i val_fin sunt respectiv valorile iniial i final ale acestei variabile, iar pas este pasul de
variaie la fiecare parcurgere a ciclului. Pasul implicit este 1.
Tratarea excepiilor
n limbajul Java, exist posibilitatea de a se trata prin program diferitele excepii care apar n timpul
execuiei. n acest fel, programatorul poate s prevad ci alternative de continuare a executrii
programului, fr a mai fi necesar oprirea executrii lui. n mediul de lucru Java, la apariia unei
excepii se genereaz un obiect special numit excepie, care conine informaia despre excepia
respectiv. Acest obiect poate fi captat prin program, iar informaia coninut n el poate fi utilizat
pentru a decide calea pe care se va merge n continuare n derularea programului. Toate obiectele de
excepie care se refer la acelai tip de incident formeaz o clas de excepii.
Tratarea prin program a excepiilor se face, n limbajul Java, folosind instruciunea try urmat de una
sau mai multe clauze catch i, opional, de o clauz finally sub forma urmatoare:
try {
secventa
}
catch (ClasaExceptie1variabila1) {
secventa1
}
catch (ClasaExceptie2 variabila2) {
secventa2
}
...............
catch (ClasaExceptieN variabilaN) {
secventaN
}
[finally {
secventa_finalizatoare
}]
Instruciuni etichetate
n principiu, orice instruciune n limbajul Java poate purta o etichet. Instruciunile etichetate au forma
etichet : instruciune
unde
etichet este un identificator;
instruciune este o instruciune simpl sau structurat.
Exemplu
alpha: x=2*a+b;
Se permite s se foloseasc drept etichete chiar i identificatori care mai sunt folosii n acelasi
program ca nume de variabile, clase, metode etc., far a se crea prin aceasta confuzii, deoarece
compilatorul face distincie ntre etichete i nume n funcie de contextul n care acestea sunt utilizate.
16
Instruciunea break
Instructiunea break se poate folosi n corpul unei instruciuni switch, while, do..while sau for i are ca
efect ieirea forat (abrupt) din structura de control n care se gsete instruciunea respectiv.
Instruciunea continue
Instruciunea continue se poate folosi numai n corpul ciclurilor (while, do..while, for). Dac
instruciunea continue nu are etichet, efectul este c se trece peste restul instruciunilor din corpul
ciclului, ncepnd din punctul n care se gsete instruciunea continue pn la sfritul acestuia, dar se
continu executarea ciclului, adic se reia executarea corpului acestuia ct timp este satisfacut
condiia de continuare.
Tipul referin
n memoria mainii virtuale Java, obiectele sunt plasate ntr-o zon de memorie special, numit memorie
dinamic (n englez: heap, adic "gramad"). Localizarea n memorie a obiectelor se face cu ajutorul unor
variabile speciale, numite variabile referin. Valoarea unei variabile referin nu este obiectul nsui, ci o
referin la acest obiect. Din aceast cauz, se consider c variabilele referint aparin unui tip de date
numit tip referin. Mulimea de valori a acestui tip este mulimea referinelor, adic mulimea locaiilor
(adreselor) din memoria dinamic. Operaiile permise asupra datelor de tip referina sunt cele date de
operatorii de atribuire (=), egalitate (==) i inegalitate (!=) care au aceleai semnificaii i mod de utilizare
ca pentru toate celelalte tipuri de date.
17
daca r1 este o variabil referin care indic un anumit obiect din memorie, iar met(a)este o metod
nestatic a clasei creia i aparine acest obiect, atunci r1.met(a) are ca efect invocarea metodei met
pentru obiectul indicat de r1. n acest fel, metoda met(a) va folosi att cmpurile (nestatice ale)
obiectului indicat de referina r1, ct i cmpurile (statice ale) clasei creia i aparine acest obiect.
Dac o metoda are efect lateral, ea poate fi invocat i sub forma de instruciune. Aceast instruciune
const numai din expresia de invocare a metodei, urmat de punct_i_virgul. n acest caz, valoarea
ntoars de metod (valoarea expresiei) este ignorat, folosindu-se numai efectul lateral al metodei
respective. Un exemplu cunoscut deja este instruciunea
System.out.println(sir);
Motenirea i polimorfismul
Motenirea este una din proprietile fundamentale ale claselor n programarea orientat pe obiecte. Ea
const n faptul c dintr-o clas se pot deriva alte clase. Clasa de baza se mai numeste i superclas, iar
clasele derivate se numesc i subclase.
Fiecare clas derivata motenete cmpurile i metodele superclasei. Aceasta nseamn c toate cmpurile i
metodele existente n superclas sunt utilizabile i n subclas, dar n aceasta din urm pot exista, de
asemenea, cmpuri i/sau metode suplimentare.
Polimorfismul este o alta proprietate fundamental a claselor. n limbajul Java este posibil ca o metod a
superclasei s fie redefinit n subclas. Aceasta nseamn c ea va avea n subclas acelai nume i aceeasi
lista de parametri i acelai tip de valoare ntoars ca n superclas, dar va avea un comportament diferit.
Constructori
Constructorul este o procedur special, prin care se construiesc obiecte dintr-o anumit clas.
Constructorul are ntotdeauna acelai nume cu clasa . n schimb, o clas poate avea mai muli constructori,
care pot s difere ntre ei prin numrul i/sau tipul argumentelor. Constructorul aloc n memoria dinamic
spaiul necesar pentru un obiect din clasa creia i aparine i iniializeaz cmpurile acestui obiect cu valori
care depind de argumentele sale.
Pachetele de clase
Principalele pachete de clase sunt:
java.lang - conine clasele de baz necesare programrii n limbajul Java;
java.io - conine clasele necesare pentru programarea operaiilor de intrare/ieire;
java.util - conine clase pentru anumite structuri de date tipice (list, stiv etc) i alte clase utile;
java.awt si javax.swing - conin clase necesare pentru realizarea interfeelor grafice;
java.applet - pentru programarea appleturilor.
Declaraia import
Pentru a putea utiliza ntr-un fiier-sursa Java un anumit pachet (subpachet) de clase, la nceputul
fiierului respectiv trebuie pus declaraia
import nume_pachet.*;
n care nume_pachet este numele calificat al pachetului respectiv. De exemplu, pentru a utiliza orice
18
Pachetul java.lang
Pachetul java.lang conine clasele fundamentale i exist pe orice platform Java. Pentru acest pachet nu este
necesar declaraia import, clasele sale fiind importate implicit. Lista complet a claselor din pachetul
java.lang i descrierea lor se gsesc n documentaia Java API de pe Internet.
Clasa Object
Clasa Object este rdcina ierarhiei de clase a platformei Java. Este singura clas care nu are o
superclas. Orice alt clasa este derivat direct sau indirect din clasa Object.
Conceptual, instanele clasei Object sunt obiecte oarecare, fr atribute precizate. Variabilele referin
la Object se folosesc atunci cnd, la elaborarea programului, se consider c lor li se pot da ca valori
referine la orice fel de obiecte, indiferent de clasa creia i aparin.
n clasa Object sunt declarate, de asemenea, metode care se consider ca trebuie s existe n toate
celelalte clase. Unele din aceste metode vor trebui redefinite n clasele derivate, pentru a efectua
aciuni specifice acestor clase.
Clase de exceptii
n pachetul java.lang exist i numeroase clase de excepii. Instanele acestor clase sunt creeate de
ctre maina virtual Java atunci cnd se produce o excepie, adic o situaie anormal n procesul de
calcul. Toate aceste clase sunt descrise n documentatia Java API. Vom meniona aici numai dou dintre
ele, celelalte urmnd s fie indicate la descrierea claselor care conin metode care pot genera excepii.
n limbajul Java se face distincie ntre excepie i eroare. Se consider ca excepiile sunt incidente care pot
fi captate prin mecanismul try .. catch i pot fi deci tratate prin program, n timp ce erorile sunt incidente
19
grave, care - de regul - nu pot fi tratate prin program ci produc oprirea executrii acestuia.
Clasa Exception
Aceast clas este rdcina ierarhiei claselor de excepii. n consecin, atunci cnd dorim ca in clauza
catch sa fie captat orice fel de excepie, scriem aceast clauz sub forma
catch(Exception e) {
instructiuni_de_tratare_a_exceptiei e
}
unde e este numele simbolic (identificatorul) dat excepiei captate. Clasa are doi constructori:
public Exception()
creeaz un obiect din clasa Exception (deci "o excepie") care nu conine nici un mesaj.
public Exception(String s)
creeaz un obiect din clasa Exception, care conine un mesaj sub forma irului s. Prin acest mesaj se
indic, de regul, ce incident a condus la generarea excepiei respective.
Clasa Class
O caracteristic important a limbajului i platformei Java este c clasele i interfeele utilizate n program
sunt prezente n memoria mainii virtuale Java n timpul executrii programului, sub forma de instane ale
clasei Class. n consecin, se pot obine n timpul executrii unui program informaii despre clasele crora
le aparin obiectele din memorie.
Clasa Class nu are un constructor public. n schimb, putem obine un obiect din aceast clas folosind
metoda getClass() a clasei Object. Exist i instane ale clasei Class pentru tipurile de date primitive.
Acestea sunt coninute sub forma de cmpuri statice n clasele acoperitoare ale tipurilor primitive
respective.
Clasa system
Clasa System conine cmpuri i metode utile pentru realizarea legturii dintre aplicaie i sistemul de
execuie Java (cel care implementeaz maina virtual Java). Aceast clas nu poate fi instaniat.
Cmpuri statice:
Clasa System are trei cmpuri statice care reprezint unitile standard de intrare/ieire ale sistemului:
public static final InputStream in - este intrarea standard a sistemului. De regul, aceasta este tastatura, dar
poate fi i alt dispozitiv indicat de utilizator.
public static final PrintStream out - este ieirea standard a sistemului. De regul este unitatea de afiare
standard (ecranul) dar poate fi i alt dispozitiv indicat de utilizator. Afiarea datelor pe ecran se face, de
regul folosind metoda System.out.println(sir) sau System.out.print(sir).
public static final PrintStream err - unitatea standard de ieire pentru erori. De regul este aceeai ca pentru
obiectul out, dar poate fi i alt dispozitiv indicat de utilizator.
20
Tablouri (Arrays)
Tabloul (n englez Array) este o structur de date de acelasi tip, numite componente ale tabloului, care sunt
specificate prin indici. n programare, tabloul poate fi privit ca o colecie indexat de variabile de acelai
tip.
Declararea claselor
Pn n prezent, s-a artat modul n care putem utiliza n programul nostru clase existente n biblioteci
(n pachetele de clase). Vom studia n continuare cum putem crea propriile noastre clase.
Cea mai simpl form a unei declaraii de clas este urmtoarea:
class NumeClasa {
declaratii_de_membri
}
Observm c declaraia ncepe cu cuvntul-cheie class, urmat de numele clasei i de corpul clasei,
cuprins ntre acolade.
21
Numele clasei este un identificator. Se obisnuiete ca numele clasei sa nceap cu liter majuscul.
Dac numele este compus din mai multe cuvinte, fiecaredin acestea ncepe cu majuscul.
Corpul clasei cuprinde declaraii de membri ai clasei respective. Acestea pot fi:
- declaraii de cmpuri;
- declaraii de constructori;
- declaraii de metode.
Nu este obligatoriu ca ntr-o clas s existe toate aceste categorii de declaraii. Pot exista, de exemplu,
clase n care apar numai declaraii de metode. n principiu, pot exista i clase care conin numai
cmpuri i nu conin metode, dei astfel de situaii apar foarte rar n practic.
Declararea metodelor
n programarea orientat pe obiecte, clasa conine, n mod normal, nu numai cmpuri de date, ci i
metodele prin care se trateaz aceste cmpuri.
Sub aspect conceptual, metoda este o funcie sau o procedur, care folosete drept date att valorile
argumentelor sale, ct i cmpurile clasei creia i aparine metoda respectiv.
n principiu, deosebirea dintre funcie i procedur este c funcia "ntoarce" o valoare, n timp ce metoda nu
ntoarce o valoare, ci are numai efect lateral. O funcie fr efect lateral este realizarea n program a
conceptului matematic de funcie i este folosit n expresiile de calcul numai pentru valoarea ei. n
limbajele C/C++ i Java, procedurile se scriu, din punct de vedere sintactic, la fel ca funciile, dar se
consider c ele intorc o valoare special numit void. Acesta este un artificiu pentru a indica faptul c o
asemenea "funcie" nu ntoarce o valoare.
n limbajele de programare tradiionale, o funcie (sau procedura) folosete ca date argumentele sale i
variabilele globale. n limbajul Java nu exist variabile globale i nici funcii independente (care s nu fie
metode ale unor clase). n schimb, fiecare metod poate folosi ca date att argumentele salei variabilele
22
Instructiunea return
Dac funcia ntoarce o valoare (diferit de void), aceasta se indic prin instruciunea
return expresie;
Efectul acestei instruciuni este urmtorul: se evalueaza expresia expresie i se ncheie executarea funciei
respective, ntorcnd valoarea astfel obinut. n consecin, chiar dac dup instruciunea return mai apar n
corpul funciei respective i alte instruciuni, acestea nu vor mai fi executate.
Dac metoda nu ntoarce o valoare (ntoarce void), folosirea instruciunii return nu este absolut necesar,
ncheierea execuiei fcndu-se cnd se ajunge la acolada prin care se sfrsete blocul funciei. Totui, dac
este necesar s se ncheie n mod abrupt executarea corpului funciei, se poate folosi instruciunea return fr
expresie.
Metode statice
La declararea metodelor statice, n faa tipului valorii ntoarse se pune modificatorul static. Metodele care
conin n declaraie acest modificator se numesc statice sau ale clasei, spre deosebire de metodele obinuite
care sunt ale instanei. n corpul metodelor statice se pot folosi numai cmpurile statice ale clasei respective
i se pot invoca numai alte metode statice ale acestei clase.
23
- transmitere prin nume: de la programul apelant ctre funcie (procedur) se transmit numele
argumentelor;
- transmitere prin referin: de la programul apelant la funcie (procedur) se transmit referine ctre
argumente.
n limbajul Java, transmiterea parametrilor (argumentelor) metodelor se face prin valoare . Aceasta
nseamn c:
- dac argumentul aparine unui tip de date primitiv, se transmite chiar valoarea primitiv a
argumentului respectiv;
- dac argumentul aparine unui tip-referin (este instan a unei clase), se transmite - de fapt - o
referin ctre un obiect din clasa respectiva sau dintr-o clasa derivat din aceasta.
Consecina faptului c parametrii metodelor se transmit prin valoare este urmtoarea: chiar dac
n corpul unei metode se atribuie unui argument formal al acesteia o nou valoare, aceast atribuire nu
modific valoarea argumentului efectiv corespunztor din programul apelant. Daca ns, n cazul unui
argument-referin, nu se modifica referina nsi, ci valorile cmpurilor obiectului indicat de ctre
aceasta, modificarea respectiv se va transmite i la programul apelant, constituind efectul lateral al
metodei respective.
Metode recursive
O metod (funcie sau procedur) care se invoc pe sine nsi se numete metod recursiv. Dou sau
mai multe metode care se invoc una pe alta (metoda A invoc metoda B i reciproc) se numesc mutual
recursive. Limbajul Java permite utilizarea metodelor recursive i mutual recursive. Vom ilustra
aceasta prin exemple. Vom arta, de asemenea c, de regul, aceleai funcii pot fi calculate att
recursiv, ct i iterativ (folosind cicluri). n general, n limbajele funcionale se utilizeaz predominant
funciile recursive, n timp ce n limbajele procedurale se prefera iteraia, dei n unele dintre ele (cum
este i limbajul Java) se pot folosi att iteraia, ct i recursia.
Remarcam c, la fel ca n cazul ciclurilor iterative, n metodele recursive trebuie s existe o condiie de
oprire a repetrii. n caz contrar recursia ar continua pn la depirea spaiului de memorie alocat
pentru memorarea datelor intermediare (numit stiv).
Comparnd metodele recursive cu cele iterative se constat c:
- metodele recursive sunt "mai elegante", fiind i mai uor de ineles de ctre om dect cele iterative;
- din punct de vedere computaional, metodele iterative sunt mai eficiente, deoarece solicit mai
puin memorie i sunt mai rapide dect cele recursive. Deosebirea este cu att mai mare, cu ct
numrul de invocari succesive, respectiv de repetri, este mai mare.
Instructiunea throw
Cunoatem deja c, la apariia anumitor anomalii n executarea programului, maina virtual Java
genereaz excepii. Excepiile sunt obiecte din clasa Exception s-au dintr-o subclas a acesteia. Este
posibil ca programatorul s prevad, n anumite puncte ale programului, generarea unor excepii,
folosind n acest scop instruciunea throw, care are forma urmtoare:
throw new ConstructorExceptie(lista_argumente);
n limba englez, throw este imperativul de la "a arunca". n aceast instruciune, se folosete
operatorul new pentru a genera un obiect al clasei de excepii creia i aparine constructorul invocat,
24
dup care acest obiect este "aruncat", fie pentru a fi "prins" (captat) printr-o structura try .. catch i
tratat prin program, fie pentru a fi preluat de maina virtual Java care, n acest caz, oprete execuia
programului.
Clauza throws
n mod normal, excepiile generate ntr-o metod sunt tratate prin structuri try .. catch. chiar n metoda
n care au fost generate. Este ns posibil ca metoda respectiv s "arunce" mai departe excepiile
generate n corpul ei. Pentru a indica aceast proprietate, la declararea metodei, dup paranteza care
conine lista declaraiilor argumentelor formale se pune clauza throws ClasaDeExceptii, n care se
indic numele clasei excepiei care este "aruncat" ctre metoda invocatoare (Cuvantul throws este
persoana a treia singular a verbului to throw, "a arunca").
Clase publice
Clasele publice sunt clase care pot fi utilizate i n alte pachete, dect cel din care fac parte.
Fiecare clas public se declar ntr-un fiier separat, care are obligatoriu acelai nume cu cel al clasei
i extensia java. n declaraia de clas, n faa numelui clasei se pune modificatorul public.
Colectorul de reziduuri
Dac un obiect nu mai este necesar, el poate fi distrus, adic eliminat din memorie. n maina virtual
Java, exist un colector de reziduuri de memorie (englez: garbage collector) care elibereaz automat
spaiul de memorie ocupat de obiectele ctre care nu mai exist nici o referin. n consecin,
programatorul nu mai este pus n situaia s prevad explicit n program distrugerea obiectelor i, deci
clasele nu mai conin destructori, ca n alte limbaje de POO.
25
26
- metodele superclasei pot fi redefinite n subclas prin alte metode cu aceeai signatur;
- metodele statice ale superclasei pot fi ascunse n subclas;
- cmpurile superclasei pot fi ascunse n subclas prin cmpuri cu acelai nume dar care pot avea,
eventual, alt tip.
- cmpurile unei clase pot fi ascunse chiar i n metodele clasei respective, dac aceste metode au
argumente sau variabile locale cu acelai nume.
Agregarea (englez: aggregation) este proprietatea obiectelor de a putea ncorpora alte obiecte. Aa dar,
"datele" coninute ntr-un obiect pot fi nu numai date primitive, ci i obiecte. Se pot astfel crea obiecte cu
structuri din ce n ce mai complexe.
Caracteristicile obiectelor i claselor: Clasificarea
Clasificarea (englez: classification) este proprietatea obiectelor care au aceeai structur de date i acelai
comportament (aceleai metode) de a putea fi grupate ntr-o clas. Clasa este o abstractizare, care conine
acele proprieti ale obiectelor, care sunt importante ntr-o aplicaie sau ntr-o categorie de aplicaii, i le
ignor pe celelalte. De exemplu, n aplicaii privind situaia profesional a studenilor, clasa Student conine
astfel de atribute ca numele i prenumele studentului, facultatea, anul de studii, examenele promovate i
notele obinute, dar ignor atribute ca nlimea, culoarea ochilor sau a prului, greutatea etc., care nu sunt
necesare n aplicaia respectiv. Spre deosebire de agregare, care este o relaie ntre obiecte, clasificarea este
o relaie ntre concepte reprezentate prin clase.
n functie de nivelul de abstractizare, clasele pot forma o structura ierarhic. De exemplu, clasa mijloacelor
de transport cuprinde subclasele mijloacelor de transport terestre, navale i aeriene. Clasa mijloacelor de
27
transport terestre le cuprinde pe cele rutiere i feroviare. Clasa mijloacelor de transport rutiere cuprinde
clasele automobilelor i autocamioanelor etc. Fiecare subclas a unei clase este ea nsi o clas. O astfel de
ierarhie de clase este reprezentat n Figura 2.
Metode finale
Metodele finale sunt metode care nu mai pot fi redefinite n clasele derivate. Astfel de metode se
declar cu modificatorul final. De exemplu, n clasa Object, metoda getClass este o metoda final, fiind
declarat sub forma public final Class getClass(). Aceasta inseamn c n nici o alt clas nu este
posibil ca aceasta metod s fie redefinit. Cnd declarm propriile noastre clase, avem i noi
posibilitatea s declarm c unele din metodele lor sunt finale.
28
Clase finale
Dac se dorete ca o clas s nu poat avea subclase, la declararea acesteia se folosete modificatorul
final. De exemplu, dac se dorea ca clasa CD1, dat ca exemplu mai sus, s fie finala, ea trebuia
declarata sub forma
public final class CD1 extends S1
sau, dac nu se dorea sa fie publica, sub forma
final class CD1 extends S1
Ascunderea campurilor
Cmpurile declarate ntr-o clas pot fi ascunse prin cmpuri cu acelai nume declarate n subclas,
chiar dac acestea au tipuri diferite. Aceasta nseamna c, n mod normal, n metodele clasei se folosesc
cmpurile declarate n clasa respectiv, i nu cele cu acelai nume ale superclasei. n subclas pot fi,
totui, folosite i cmpurile superclasei, dac sunt calificate cu referina super.
29
metode, pot fi create instane ale acestei clase, putndu-se astfel utiliza i cmpurile i metodele de
instan ale acestora.
Clase abstracte
Clasele abstracte conin n declaraia lor modificatorul abstract. Clasele abstracte nu pot fi instaniate.
Remarcm nsa c pot exista clase care nu pot fi instaniate dei nu sunt abstracte, cum sunt, de
exemplu, clasele care nu au dect constructori privai.
Cu toate c clasa abstract nu poate fi instaniat, se pot declara variabile aparinnd unor clase
abstracte. Acestor variabile li se pot da nsa ca valori numai referine ctre instane ale unor subclase
concrete. De exemplu, daca A este o clas abstracta, iar B este o subclas concreta a clasei A, atunci
este corect declaraia
A a1=new B();
Din punct de vedere conceptual, clasa abstract modeleaz un concept general, care trebuie apoi dezvoltat
prin subclase. Subclasele unei clase abstracte pot fi, la rndul lor, abstracte sau concrete. De exemplu, clasa
abstract FiguraPlana poate avea ca subclase clasele Cerc, Elipsa, Poligon etc.
Din punct de vedere al progrmarii, clasa abstract conine cel puin o metod abstract, adic o metod
pentru care s-a declarat numai antetul, fr s i se defineasc i corpul. O clas poate s conin o metod
abstract n mai multe moduri:
a/ n corpul clasei este declarat explicit o metod abstract;
b/ clasa mostenete de la superclasa ei o metod abstract, care nu este definita nici n corpul clasei
curente;
c/ clasa implementeaza o interfa, dar nu definete una sau mai multe din metodele acesteia.
Dac apare o astfel de situaie, iar clasa nu este declarat n mod explicit abstract, se genereaza o eroare la
compilare.
Interfete
Interfaa este o specificaie care descrie metodele publice i variabilele finale publice pe care trebuie sa le
aib o clas care implementeaza interfaa respectiv. Dac o clas implementeaz mai multe interfee, ea
conine toate metodele publice i variabilele finale publice ale acestora.
Interfaa nu este o clas, dar poate fi utilizat de programator ca i cnd ar fi o clas abstract. Se pot
declara variabile referin la o interfa n mod asemntor cu declararea variabilelor referina la
obiecte aparinnd unei clase, adic sub forma:
interfaa nume_variabila1[=initializare1], ..., nume_variabilaN[=initializareN];
30
Declararea interfetelor
O declaraie de interfa introduce un nou tip referin, ai crui membri sunt cmpuri statice finale i
metode abstracte. n consecin, interfaa se aseamn cu o clasa abstract pur, care nu conine dect
metode abstracte i cmpuri statice finale i nu se ncadreaz n ierarhia unic de clase descendente din
Object (amintim ca o clasa abstract, n afar de una sau mai multe metode abstracte, poate conine i
cmpuri de date i metode concrete i este descendent a clasei Object).
Dei nu se ncadreaz n ierarhia claselor, interfeele se pot constitui in diverse ierarhii de interfee,
aplicndu-li-se principiul mostenirii. O clas poate implementa mai multe interfee.
Cel mai important avantaj al folosirii interfeelor este c mai multe clase, de pe diferite ramuri ale
arborelui ierarhic al claselor, pot fi "vzute" printr-o singur interfa. Se pot declara variabile referin
la interfa la fel cum se pot declara variabile referin la clas. Interfaa este abstract i deci nu poate
fi instaniat. n schimb, unei variabile referin la interfa i se pot atribui ca valori referine la
obiecte din orice clas care implementeaz interfaa respectiv.
Declaraia de interfa are forma general urmtoare:
[public] interface NumeInterfata [extends lista_superinterfete] {
declaratii_de_membri_ai_interfetei
}
31
Clasa interioar (clasa imbricat nestatic) are cte o instan n interiorul fiecrei instane a clasei care
o conine. n consecin, accesul la membrii ei se poate face folosind drept calificator referina la o
instan. Clasa interioar are acces la toi membrii clasei care o conine, att la cei statici, ct i la cei
de instan (nestatici).
Clasa java.awt.Component
Clasa Component este o clas abstract, derivat direct din clasa Object.
Dintre numeroasele metode ale acestei clase, prezentm aici numai cteva mai frecvent folosite:
public boolean isVisible() - testeaz dac aceast component este vizibil, atunci cnd este vizibil i
containerul n care se gsete;
public void setVisible(boolean visible) - face componenta sa fie vizibil sau nu, dup cum argumentul este
true sau false;
public boolean isShowing() - determin dac componenta este efectiv afiat pe ecran;
public Point getLocation() - ntoarce locaia componentei (poziia colului din stnga sus n containerulprinte) sub forma unei instane a clasei Point;
public void setLocation(Point location) - seteaz noua poziie a componentei n cadrul containerului
printe;
public Dimension getSize() - ntoarce dimensiunea componentei;
public void setSize(int latime, int inaltime) - seteaz noile dimensiuni ale componentei.
n aceste metode se utilizeaz i clasele auxiliare Point i Dimension din pachetul java.awt. Instanele clasei
Point conin coordonatele unui punct. Se consider c originea sistemului de coordonate se afl n colul din
stnga sus, axa Ox este orientat ctre dreapta, iar axa Oy este orientata n jos. Instanele clasei Dimension
conin dimensiunile componentei: limea i nlimea.
Clasa JFrame
are o structur destul de complicat i este descris complet n documentaia Java.API. Pentru a nu
intra de la nceput n detalii, vom da, deocamdat, numai cateva informaii strict necesare pentru
folosirea acestei clase, urmnd s revenim ulterior cu indicaii suplimentare.
Principalul constructor este:
JFrame(String titlu)
unde titlu este titlul ferestrei.
Clasa JFrame are numeroase metode, att proprii, ct i motenite de la superclasele ei. n afar de
metodele motenite de la clasa Component, deocamdat, vom mai meniona aici numai dou, care sunt
motenite de la clasa Frame:
public String getTitle() - ntoarce titlul ferestrei;
public void setTitle(String titlu) - pune ferestrei un titlu (n locul celui existent).
32
La crearea ei, instana clasei JFrame nu este vizibil. Pentru a o face vizibil se folosete metoda public
void setVisible(boolean visible) a clasei Component.
Clase de evenimente
Clasele de evenimente se gsesc n pachetele java.awt.event i javax.swing.event i formeaz o ierarhie
de clase, care are ca radacin clasa abstract java.awt.AWTEvent. Aceasta, la rndul ei, extinde clasa
java.util.EventObject din pachetul java.util.
Orice eveniment conine urmtoarele metodele declarate n clasa java.util.EventObject:
public Object getSource() - care ntoarce o referin ctre obiectul care a generat evenimentul
respectiv;
public String toString() - care ntoarce o reprezentare sub forma de ir a obiectului.
Orice eveniment AWT (generat de componente AWT sau JFC/Swing) conine un cmp protejat de tip
int numit id, a crui valoare indic tipul evenimentului. Toate clasele de evenimente conin cmpuri
statice finale de tip int, al cror nume indic tipul de eveniment i a cror valoare este valoarea
corespunztoare a cmpului id. Valoarea acestui cmp se poate obine prin metoda
public int getId()
Evenimentele pot fi de nivel cobort (low level event) sau semantice. Numele claselor de evenimente de
nivel cobort indic fie componenta, fie dispozitivul de intrare care le-a generat, de exemplu:
ComponentEvent, WindowEvent, MouseEvent, KeyEvent. Numele claselor de evenimente semantice
indic mai curnd tipul de eveniment, dect sursa acestuia, de exemplu: ActionEvent, TextEvent.
33
Evenimente de mouse
Evenimentele de mouse sunt instane ale clasei java.awt.event.MouseEvent i sunt generate de ctre
orice component a interfeei grafice, atunci cnd asupra ei se acioneaza cu mouse-ul. Clasa
MouseEvent este derivat din clasa java.awt.event.InputEvent. Evenimentele de mouse sunt intrarea
cursorului de mouse ntr-o component sau ieirea din aceasta, apsarea unui buton de mouse sau
eliberarea lui, efectuarea unui click de mouse (simplu sau multiplu) pe suprafaa componentei,
micarea mouse-ului.
34
n AWT se face distincie ntre evenimentele de mouse discrete i evenimentele care caracterizeaz micarea
continu a mouse-lui.
a/ Evenimente de mouse
- a fost apsat un buton al mouse-ului (MOUSE_PRESSED);
- a fost eliberat un buton al mouse-ului (MOUSE_RELEASED);
- s-a fcut click de mouse, adic un buton al acestuia a fost apsat i eliberat imediat
(MOUSE_CLICKED);
- cursorul mouse-ului a intrat ntr-o component (MOUSE_ENTERED);
- cursorul mouse-ului a ieit din component (MOUSE_EXITED).
Ascultarea acestor evenimente se face cu instane ale claselor care implementeaza interfaa
java.awt.event.MouseListener.
b/ Evenimente de micare a mouse-ului
- mouse-ul s-a micat pe suprafaa componentei (MOUSE_MOVED);
- mouse-ul a fost "tras" pe suprafaa componentei, adic a fost micat innd un buton apsat
(MOUSE_DRAGGED).
Aceste evenimente sunt ascultate cu instane ale claselor care implementeaz interfaa
java.awt.event.MouseMotionListener.
Evenimente de tastatura
De cte ori se apas sau se elibereaz o tast, componenta activ a interfeei grafice genereaz un eveniment
de tast din clasa java.awt.event.KeyEvent. Acesta poate fi tratat cu un "asculttor de taste" care
implementeaz interfaa java.awt.event.KeyListener sau care extinde clasa java.awt.event.KeyAdapter.
Se disting urmtoarele evenimente generate la acionarea tastelor:
- a fost apasat o tast (KEY_PRESSED);
- a fost eliberat o tast (KEY_RELEASED);
- a fost "tiprit" un caracter, adic a fost apasat i eliberat o tast care transmite un caracter tipribil
(KEY_TYPED).
Aceste situaii pot fi detectate cu metodele corespunztoare ale interfeei KeyListener.
Evenimentul generat de tast conine, n afar de codul tastei acionate, i informaii privind starea tastelor
auxiliare Ctrl, Alt i Shift n momentul producerii evenimentului respectiv. Aceste stri pot fi detectate cu
metodele corespunztoare ale interfeei superclasei java.awt.event.InputEvent.
35
36
Clasa BorderLayout
ncepem cu aceast clas, deoarece este gestionarul de poziionare implicit pentru coninutul instanelor
clasei JFrame. n acest caz, se consider c suprafaa containerului este imparit n cinci zone numite,
respectiv, NORTH, SOUTH, WEST, EAST si CENTER. n fiecare din aceste zone se poate plasa numai o
singur component, care poate fi ns ea nsi un container. Adugarea de componente la container se face,
n acest caz, folosind metoda add(componenta, BorderLayout.ZONA), unde componenta este referina la
componenta adaugat, iar ZONA este una din cele cinci zone menionate mai sus. Dac se folosete metoda
add(componenta), fr a indica zona, componenta respectiv este plasat implicit n zona CENTER, aa cum
s-a procedat n seciunea precedenta, n exemplul din fiierul AdComp.java.
Clasa FlowLayout
Clasa java.awt.GridLayout
Gestionarele de poziionare din clasa java.awt.GridLayout plaseaz componentele n celulele unei
grile rectangulare. n consecin, toate componentele de pe aceeai coloan sunt aliniate vertical.
Clasa are doi constructori:
public GridLayout(int rows, int cols) - are ca argumente numrul de linii i de coloane al grilei;
public GridLayout(int rows, int cols, int hgap, int vgap) - are n plus ca argumente spaiul orizontal
i, respectiv, vertical ntre componente.
Dei n constructor se indic att numrul de linii, ct i cel de coloane ale grilei, n realitate numai
numrul de linii este respectat, n timp ce numrul de coloane este practic ignorat. La stabilirea
amplasrii componentelor n container, dac numarul lor total este mai mic sau egal cu cel de linii,
toate componentele vor fi aezate vertical, una sub alta. Dac numrul de componente este mai mare
dect numrul de linii, numrul de coloane se stabilete automat, prin mprirea numrului de
componente la cel de linii, cu rotunjire n plus. Plasarea efectiv a componentelor n celulele grilei
astfel creeate se face apoi de la stnga la dreapta i de sus in jos, la fel ca n cazul gestionarului
FlowLayout, dar respectnd alinierea vertical i orizontal impus de gril.
37
Clasa javax.swing.BoxLayout
Gestionarul de poziionare javax.swing.BoxLayout plaseaz toate componentele containerului pe o
singur direcie, care poate fi orizontal sau vertical.
Constructorul clasei este
public BoxLayout(Container target, int axis)
n care target este o referina la containerul int (al crui gestionar de poziionare este creat), iar axis
poate fi BoxLayout.X_AXIS sau BoxLayout.Y_AXIS i indic direcia (axa) dup care vor fi plasate
componentele.
38
Clasa java.awt.Panel (panou) reprezinta cel mai simplu container, care este o suprafa
dreptunghiular fr bordur. Gestionarul de poziionare implicit este FlowLayout, dar se poate pune
oricare altul. Panourile sunt frecvent folosite pentru a plasa pe ele diferite componente, formnd un
grup care se plaseaza apoi ntr-un alt container. Clasa javax.swing.JPanel este varianta de Panel
folosit n JFC/Swing, fiind un container genreric.
Clasa Box
Clasa javax.swing.Box are ca instane containere speciale, care nu pot folosi dect gestionarul de
poziionare javax.swing.BoxLayout. Orice incercare de a-i pune alt gestionar produce o eroare de
execuie din clasa AWTError.
ntr-un container din clasa Box, componentele pot fi amplasate numai pe o singur direcie: orizontal
sau vertical.
Clasa dispune de metode statice pentru crearea de "casete" (instane ale clasei Box) orizontale sau verticale:
public static Box createHorizontalBox()
public static Box createVerticalBox()
Se pot creea, de asemenea "componente invizibile" de dimensiuni fixe sau variabile, care pot fi folosite la
distanarea componentelor vizibile. n acest scop, se folosesc metodele
public static Component createRigidArea(Dimension d) - creeaza o "component ascuns" de dimensiune
fix;
public static Component createHorizontalStrut(int width) - creeaza o "component ascuns" de lime fix,
dar de nlime variabil;
public static Component createVerticalStrut(int height) - creeaza o "component ascuns" de nalime fix,
dar de lime variabil;
public static Component createGlue() - creaza o "component ascuns" cu ambele dimensiuni variabile;
Combinarea adecvat de containere din clasa Box i folosirea n acestea a diferitelor componente
vizibile i ascunse permite crearea de interfee grafice cu aspecte foarte diversificate.
39
Clasa javax.swing.JComponent
Clasa abstracta javax.swing.JComponent extinde clasa java.awt.Container. In consecin, orice
componenta Swing are i caracteristici de container.
Iat, ca exemplu, cteva faciliti pe care le ofera orice JComponent:
- posibilitatea de a-i ataa componentei o "inscripie volanta" (englez: ToolTip), adic o inscripie
explicativ care apare cnd punem cursorul de mouse pe componenta respectiv, fr s apsm butonul. O
astfel de inscripie se ataeaz componentei prin metoda
public void setToolTipText(String text);
- posibilitatea de a-i pune componentei o bordur, folosind metoda
public void setBorder(Border border);
- posibilitatea de a modifica culoarea de fond i culoarea de primplan ale componentei folosind metodele:
public void setBackground(Color color);
public void setForeground(Color color);
Componente de control
Componentele de control sunt dispozitive de intrare virtuale, uor de utilizat, prin intermediul crora
utilizatorul poate introduce anumite comenzi. Din aceast categorie fac parte butoanele, riglele
ajustabile, listele, listele ascunse, meniurile i cmpurile de text.
40
Butoane
Butoanele sunt obiecte grafice, al cror aspect este similar celor al butoanelor folosite n aparatura
electronic i electric. Acionarea butonului se face punnd deasupra lui cursorul mouse-ului i
apasnd un buton al acestuia. n JFC/Swing exist mai multe tipuri de butoane: butonul simplu, caseta
de validare, butonul radio i articolul de meniu. Toate acestea sunt subclase ale clasei abstracte
javax.swing.AbstractButton.
Caseta de validare
Caseta de validare este un obiect de control cu dou stri stabile. La fiecare click de mouse pe
suprafata casetei de validare, aceasta trece dintr-o stare n cealalt. n mod obinuit, caseta de validare
este reprezentat grafic printr-un patrat, n care apare un simbol de bifare (de validare), cum ar fi
simbolul V sau X, cnd caseta se gsete n starea "selectat". n starea opus (deselectat), caseta este
vid. Imaginea casetei este insoit i de un text explicativ.
Butonul radio
Butonul radio este un buton cu dou stri stabile, care face parte dintr-un grup de butoane, astfel c la un
moment dat numai unul dintre ele poate fi "selectat". n momentul n care este selectat ("apsat") un buton al
grupului, se deselecteaz automat cel care era selectat anterior.
n JFC/Swing, butoanele radio sunt realizate ca instane ale clasei javax.swing.JRadioButton, care este
derivat din clasa javax.swing.JToggleButton. Gruparea butoanelor se face folosind clasa
javax.swing.ButtonGroup.
41
Liste
n cazul interfeelor utilizator grafice, se numete list o component care conine articole selectabile.
Selectarea lor se face de ctre utilizator, prin click de mouse pe articolul respectiv. Lista poate fi cu selecie
simpl sau cu selecie multipl, dup cum pot fi selectate simultan unul sau mai multe articole.
n JFC/Swing, listele se realizeaz ca instane ale clasei javax.swing.JList. Articolele din list pot fi, n
principiu, orice obiecte afiabile. La crearea listei, constructorului i se d ca argument tabloul obiectelor pe
care le va conine lista. Ulterior este posibil s se adauge articole la list, sau s se elimine.
Daca lista este mai lunga dect spaiul de afiare disponibil, ea poate fi pus pe un panou glisant, din clasa
javax.swing.JScrollPane.
Liste ascunse
Lista ascuns este o list din care se vede un singur articol (cel care este selectat), deci ocupa pe ecran spaiu
mult mai putin dect una obinuit. Celelalte articole ale listei sunt "ascunse" i devin vizibile numai dac se
face click pe articolul vizibil. Dac acum facem click de mouse pe un alt articol din lista devenit vizibil,
acest nou articol este selectat (rmne vizibil), iar celelalte dispar. ntr-o list ascuns nu este posibil selecia
multipl.
n JFC/Swing, pentru realizarea listelor ascunse se folosete clasa javax.swing.JComboBox
Rigla ajustabil
Clasa javax.swing.JSlider ofer o component care are aspectul unei rigle prevzute cu cursor. Prin
deplasarea cursorului cu ajutorul mouse-ului se modific valoarea indicat de rigl. Valoarea minim i cea
maxim de pe scala riglei i valoarea unei diviziuni se indic prin program. Rolul riglei poate fi asemnat cu
cel al unui dispozitiv de ajustare continu, cum este poteniometrul din aparatura electronic.
La deplasarea cursorului, rigla genereaz evenimente din clasa javax.swing.event.ChangeEvent, care sunt
ascultate cu o clas care implementeaz interfaa javax.swing.event.ChangeListener.
Meniuri
La fel ca listele sau butoanele radio, meniurile permit utilizatorului s aleag una din mai multe opiuni
posibile. n JFC/Swing se disting dou categorii de meniuri:
- meniuri cu bar, care pornesc dintr-o bar situat la partea superioar a ferestrei aplicaiei;
- meniuri derulante (pop-up), care apar n poziia n care se gsete cursorul de mouse.
Meniuri cu bar
Bara de meniu se poate plasa, daca este necesara, numai la partea superioara a ferstrei aplicatiei si se
realizeaza ca o instanta a clasei javax.swing.JMenuBar.
Bara de meniu poate sa conin unul sau mai multe meniuri, care se realizeaz ca instane ale clasei
javax.swing.JMenu. La rndul su, fiecare meniu poate conine unul sau mai multe articole, care sunt
instane ale claselor javax.swing.JMenuItem sau javax.swing.JCheckBoxMenuItem. Este ns posibil ca
un articol de meniu s fie el nsui un meniu (din clasa JMenu). Dac utilizatorul alege cu mouse-ul un aricol
de meniu, sunt posibile deci dou situaii:
- acesta este un articol propriu-zis (un JMenuItem), n care caz opiunea respectiv este selectat;
- articolul ales este el nsui un meniu (un JMenu), n care caz noul (sub)meniu se desfoar i cutarea
continu.
Meniuri derulante (pop-up)
Spre deosebire de meniurile cu bar, meniurile derulante sunt tratate ca nite componente obinuite,
care pot s fie afiate prin program, atunci cnd este necesar. n JFC/Swing, meniurile derulante se
realizeaz ca instane ale clasei javax.swing.JPopupMenu. n rest, meniul pop-up se comport la fel
ca un meniu cu bar.
42
43
Clasa Color
Clasa Color ncapsuleaz informaiile despre culoare. n Java AWT se folosete modelul de culori RGB
(englez: red, green, blue) n care fiecare culoare este considerat ca fiind compus din trei culori
fundamentale: rou, verde i albastru. n consecin, culoarea este dat prin trei numere cuprinse n intervalul
[0, 255], reprezentnd ponderile celor trei culori fundamentale. n figura de mai jos este reprezentat schema
de combinare a acestor trei culori fundamentale.
Prin modificarea ponderilor celor trei culori se pot obine, n principiu, toate culorile posibile, de la negru
[r=0,g=0,b=0] la alb [r=255,g=255,b=255]. Dac ponderile celor trei culori sunt egale, se obin diferite nuane
de gri. Culoarea galben are ponderile [r=255,g=255,b=0], culoarea cyan (azuriu) are ponderile
[r=0,g=255,b=255] iar culoarea magenta are ponderile [r=255,g=0,b=255]. Alte culori: orange:
[r=255,g=200,b=0], pink (roz): [r=255,g=175,b=175].
Clasa Color conine i un al patrulea cmp, numit alpha, care poate avea, de asemenea, valori ntregi n
intervalul [0..255] i exprima opacitatea culorii respective. Daca alpha=255, culoarea este complet opaca.
Aceasta nseamn c, dac o figur cu aceast culoare se suprapune peste alta, o mascheaz complet. Dac
alpha=0, culoarea este complet transparent, deci practic invizibil. ntre aceste valori extreme putem avea
diferite opaciti intermediare, cuprinse intre 0 si 255.
Alegerea culorii folosind clasa JColorChooser
Pentru a alege culoarea n mod interactiv, n JFC/Swing este prevazut clasa javax.swing.JColorChooser.
Instanele acestei clase sunt panouri de selectare a culorii, care pot fi folosite att prin ncorporarea lor ntr-o
fereastr obinuit, ct i sub forma unei ferestre de dialog.
Pentru a creea o fereastr de dialog, care conine n ea un JColorChooser i ntoarce culoarea selectat, n
clasa JColorChooser exist metoda
public static JDialog createDialog(Component c,String title, boolean modal, JColorChooser chooserPane,
ActionListener okListener, ActionListener cancelListener)
n care:
- c este componenta beneficiar (owner) a ferestrei de dialog create;
- title este titlul ferestrei de dialog create;
- argumentul boolean modal indic dac fereastra este modal;
- chooserPane este instana clasei JColorChooser care se ntroduce n fereastra de dialog;
- okListener si cancelListener sunt asculttoarele de aciune care reacioneaza la apsarea butonului OK,
respectiv Cancel al selectorului de culoare.
Folosind un JColorChooser, alegerea culorii se poate face n trei moduri:
- folosind un tablou de culori, n care fiecare celul este colorat n alt culoare;
- n sistemul RGB, folosind trei rigle de ajustare a culorilor fundamentale;
- n sistemul HSB, selectnd culoarea prin alegerea cu mouse-ul a punctului de pe panou care are culoarea
potrivita (trei butoane alturate, notate H, S, B, arat care din cele trei componente se menine constant,
celelalte dou fiind date de coordonatele punctului ales pe panou).
Contextul grafic
Modul de realizare a imaginilor i desenelor este strns dependent att de echipament (hardware) ct i de
sistemul de operare. Pentru a se asigura independena de platform, n Java API a fost introdus clasa
abstract java.awt.Graphics. Aceasta este clasa de baz a tuturor contextelor grafice, care permit trasarea de
desene pe suprafaa componentelor grafice realizate pe diverse dispozitive fizice. Pe fiecare platform, n
mediul de execuie Java, trebuie s existe o implementare a contextului grafic, adic o extindere a clasei
44
Graphics, care conine toate cmpurile i metodele acestei clase, dar este specific platformei respective.
Un obiect din clasa Graphics ncapsuleaz informaia de stare a contextului grafic la care se refer i anume:
- referina la obiectul din clasa Component (sau dintr-o subclasa a acesteia) pe care se deseneaz;
- o translaie a originii sistemului de coordonate; toate coordonatele din desen sunt raportate la aceast
origine;
- decupajul curent (dreptunghiul n interiorul cruia se traseaz desenul);
- culoarea curent;
- fontul curent;
- operaia logic pe pixeli curent (XOR sau paint);
- alternarea curent de culori pentru operaia pe pixeli XOR.
Originea sistemului de axe (punctul de coordonate 0,0) se gsete n colul din stnga-sus al dreptunghiului
de desenare. Axa 0x este ndreptat spre dreapta, iar axa 0y - in jos.
Practic, clasa abstract Graphics conine acele metode, care trebuie s existe n orice context grafic.
Coninutul concret al acestor metode, deci modul efectiv n care se realizeaz funciile respective, depinde de
contextul grafic real, deci de dispozitivul fizic pe care se face desenarea i de sistemul de operare folosit. Pe
programatorul de aplicaii sau miniaplicaii n Java nu l intereseaz ns acest lucru, deoarece el folosete n
programele sale metodele clasei abstracte Graphics, fr s se preocupe de modul n care acestea vor fi
executate.
Fluxul este un concept situat pe un nivel nalt de abstractizare, fiind privit ca o simpl succesiune de octei
sau de caractere care se transmite ntre surs i destinaie. Nu prezint importan nici natura sursei sau a
destinaiei, nici modul n care trebuie interpretat secvena de octeti sau de caractere respectiv. De
exemplu, un grup de 32 de octei transmii ntre surs i destinaie poate s reprezinte 32 de caractere ASCII
sau 16 caractere Unicode sau 8 numere de tip int sau 4 numere de tip double etc. Aceast abstractizare
permite s se trateze n mod unitar toate tipurile de transmisii de date.
Se disting doua feluri de fluxuri: de ieire i de intrare. Pentru un proces dat, toate fluxurile transmise de
acesta ctre exterior se numesc fluxuri de ieire, iar cele primite din exterior se numesc fluxuri de intrare. n
consecin, acelai flux este de ieire n raport cu sursa i de intrare n raport cu destinaia.
45
- Deschiderea fluxului
- ct timp (exist date de transmis)
scriere n flux
-nchiderea fluxului
-Deschiderea fluxului
- ct timp (exist date de citit)
citire din flux
-nchiderea fluxului
Pachetul java.io
n Java 2 SDK se consider c fluxurile pot fi de caractere sau de octei. n primul caz, de la surs la
destinaie se transmite o succesiune de caractere Unicode (de cte 16 bii), iar n al doilea caz - o
succesiune de octei (de 8 bii). n mod corespunztor, pentru fiecare din cele dou categorii de fluxuri
exist cte o ierarhie de clase de fluxuri de intrare i o ierarhie de clase de fluxuri de iesire. Pentru
fluxurile de caractere, rdcinile ierarhiilor de clase sunt clasele abstracte Reader i Writer.Pentru
fluxurile de octei, rdcinile acestor ierarhii sunt clasele abstracte InputStream i OutputStream.
Aceste ierarhii de clase sunt reprezentate n figurile 2, 3, 4 i 5. n afar de cele patru ierarhii
menionate, n pachetul java.io exist i clase auxiliare i interfete. Distingem trei tipuri de clase, care
sunt reprezentate n aceste figuri prin culori diferite:
- clase abstracte (culoare albastr);
- clase care efectueaz operaiile de intrare sau de ieire propriu-zise (culoare verde) i modeleaz
sursele sau destinaiile fluxurilor (englez: Data Sink Streams);
- clase care efectueaz unele operaii de transformare a datelor de pe flux (culoare violet) i
reprezinta "fluxuri de prelucrare" (englez: Processing Streams).
Clasa Reader
Clasa abstract java.io.Reader este rdcina ierarhiei de clase de fluxuri de intrare de caractere.
Metode:
public int read() throws IOException - citete din fluxul de intrare un singur caracter; ntoarce caracterul
citit (n domeniul 0 .. 16383) sau -1 dac s-a ajuns la sfrit de fiier; metoda produce blocarea procesului n
care este invocat, pn cnd apare un caracter n fluxul de intrare;
public int read(char[] cbuf) throws IOException - citete din flux o secven de caractere i le depune ntr-o
zon tampon (buffer) constituit din tabloul de caractere cbuf; ntoarce numrul de caractere citite sau -1 dac
s-a atins sfritul de fiier; metoda produce blocarea procesului pn cnd apar caractere n fluxul de intrare,
sau se ajunge la sfrit de fiier;
public abstract int read(char[] cbuf, int off, int len) throws IOException - acioneaz asemntor cu metoda
precedent, dar depunerea caracterelor citite n zona tampon de destinaie se face ncepnd de la poziia off
(offset), iar numrul maxim de caractere citite este len;
public long skip(long n) throws IOException - se sare peste n caractere din fluxul de intrare, care nu vor fi
citite; procesul apelant este blocat pan cnd apare cel puin un caracter n fluxul de intrare; dac se ntlnete
sfritul de fiier, se genereaz o excepie de intrare/ieire; ntoarce numrul de caractere srite efectiv;
public boolean ready() - ntoarce true dac fluxul de intrare este gata pentru a putea fi citit;
public void mark(int readAheadLimit) throws IOException - marcheaz poziia curent n fluxul de intrare,
pentru a se putea reveni la ea ulterior; argumentul readAheadLimit indic numrul de caractere care vor putea
fi ulterior citite din flux,fr ca acest marcaj s se piard; excepia de intrare/ieire apare dac fluxul nu
suport marcarea sau dac se produce alt eroare de intrare/ieire;
public boolean markSupported() - indic dac fluxul suport marcarea;
public void reset() throws IOException - dac fluxul a fost marcat, este readus la poziia corespunztoare
46
ultimului marcaj; dac fluxul nu a fost marcat sau nu suport resetarea, se genereaz o excepie de
intrare/ieire;
public abstract void close() throws IOException - nchide fluxul; din acest moment, invocarea metodelor
read(), ready(), mark() sau reset pentru acest flux va genera o excepie de intrare/ieire.
Clasa Writer
Clasa abstract java.io.Writer este rdcina ierarhiei de clase pentru fluxuri de ieire de caractere.
Metode:
public void write(int c) throws IOException - scrie n fluxul de ieire caracterul c;
public void write(char[] cbuf) throws IOException - scrie n fluxul de ieire caracterele coninute n tabloul
cbuf;
public abstract void(char[] cbuf, int off, int len) throws IOException - scrie n fluxul de ieire len caractere
din tabloul cbuf, ncepnd de la poziia off (offset);
public void write(String str) throws IOException - scrie n flux caracterele existente n irul str;
public void write(String str, int off, int len) throws IOException - scrie n flux len caractere din irul str,
ncepnd de la poziia off (offset);
public abstract void flush() throws IOException - "descarc" fluxul de ieire; dac fluxul a salvat ntr-o
zon tampon anumite caractere scrise cu metodele write(), aceste caractere sunt scrise efectiv n fluxul de
destinaie; dac aceast destinaie este tot un flux, invoc i metoda flush() a acestuia, astfel c se "descarc"
ntregul lan de fluxuri;
public abstract void close() throws IOException - se nchide fluxul de ieire; invocarea ulterioar a
metodelor write() sau flush() pentru acest flux va produce o excepie de intrare/ieire.
Clasa InputStream
Clasa java.io.InputStream este rdcina ierarhiei de clase pentru fluxuri de intrare organizate pe octei.
Metode:
public int read() throws IOException - citete din fluxul de intrare un singur octet; ntoarce octetul citit (in
domeniul 0 .. 255) sau -1 dac s-a ajuns la sfrit de fiier; metoda produce blocarea procesului n care este
invocat, pn cnd apare un octet n fluxul de intrare;
public int read(byte[] buf) throws IOException - citete din flux o secven de octei i i depune ntr-o
zon tampon (buffer) constituit din tabloul de octei buf; ntoarce numrul de octei citii sau -1 dac s-a
atins sfritul de fiier; metoda produce blocarea procesului pn cnd apar octei n fluxul de intrare, sau se
ajunge la sfrit de fiier;
public abstract int read(byte[] buf, int off, int len) throws IOException - acioneaz asemntor cu metoda
precedent, dar depunerea octeilor citii n tabloul de destinaie byte[] se face ncepnd de la poziia off
(offset), iar numrul maxim de octei citii este len;
public long skip(long n) throws IOException - se sare peste n octei din fluxul de intrare, care nu vor fi
citii; procesul apelant este blocat pn cnd apare cel puin un octet n fluxul de intrare; dac se ntlnete
sfritul de fiier se genereaz o eroare de intrare/ieire; ntoarce numrul de octei srii efectiv;
public int available() throws IOException - ntoarce numrul de octei disponibili pentru citire n fluxul de
intrare;
public void mark(int readAheadLimit) throws IOException - marcheaz poziia curenta n fluxul de intrare,
pentru a se putea reveni la ea ulterior; argumentul readAheadLimit indic numrul de octei care vor putea fi
ulterior citii din flux, fr ca acest marcaj s se piard; excepia de intrare/ieire apare dac fluxul nu
suport marcarea sau dac se produce alt eroare de intrare/ieire;
public boolean markSupported() - indic dac fluxul suport marcarea;
public void reset() throws IOException - dac fluxul a fost marcat, este readus la poziia corespunztoare
ultimului marcaj; dac fluxul nu a fost marcat sau nu suporta resetarea, se genereaz o excepie de
47
intrare/ieire;
public abstract void close() throws IOException - nchide fluxul; din acest moment, invocarea metodelor
read(), ready(), mark() sau reset() pentru acest flux va genera o excepie de intrare/ieire.
Clasa OutputStream
Clasa java.io.OutputStream este rdcina ierarhiei de clase pentru fluxuri de iesire de octei.
Metode:
public void write(int c) throws IOException - scrie n fluxul de ieire ultimul octet al numrului c;
public void write(byte[] buf) throws IOException - scrie n fluxul de ieire octeii coninuti n tabloul buf;
public abstract void(byte[] buf, int off, int len) throws IOException - scrie n fluxul de ieire len octei din
tabloul buf, ncepnd de la poziia off (offset);
public abstract void flush() throws IOException - "descarc" fluxul de ieire; dac fluxul a salvat ntr-o
zon tampon anumii octei scrii cu metodele write(), aceti octei sunt scrii efectiv n fluxul de destinaie;
dac aceast destinaie este tot un flux, invoc i metoda flush() a acestuia, astfel c se "descarc" ntregul
lan de fluxuri;
public abstract void close() throws IOException - se nchide fluxul de ieire; invocarea ulterioar a
metodelor write() sau flush() pentru acest flux va produce o excepie de intrare/ieire.
Clasele PrintStream i PrintWriter
Clasele java.io.PrintStream i java.io.PrintWriter se folosesc pentru a transmite ctre un flux se ieire date
formatate pentru tiprire (afiare). Se tie c forma intern a datelor difer de forma extern. De exemplu,
numerele ntregi sunt reprezentate intern sub form binar, n timp ce pe ecranul calculatorului sau la
imprimant apar sub forma unor iruri de cifre zecimale, precedate eventual de semn. Metodele claselor
PrintStream i PrintWriter fac aceast conversie din forma intern n cea extern a diferitelor tipuri de date,
genernd reprezentrile datelor respective sub forma de iruri de octei (caractere n codul ASCII) sau,
respectiv, de caractere Unicode. Aceste clase nu se folosesc n mod independent, ci adaug altui flux de ieire
(de octei sau, respectiv, de caractere) capacitatea de formatare a datelor n vederea tipririi.
Clasa PrintStream
Clasa PrintStream conine doua feluri de metode de scriere a datelor: metodele cu numele write() scriu
ntotdeauna octei (fr formatare), n timp ce cele cu numele print() sau println() formateaz datele,
respectnd convenia de codificare (pe octeti sau pe caractere) specific platformei pe care ruleaza
aplicaia respectiv. Totui, se recomand ca pentru a obine fluxuri de caractere s se foloseasc clasa
PrintWriter.
Deosebirea dintre print() i println() este c metodele cu numele println() adaug, la sfritul irului de
octei generat, un caracter de sfrit de linie ('\n'). n consecin, dac se folosete metoda print(),
afiarea se face fr a se trece la o linie nou, n timp ce dac se folosete metoda println(), dup
afiare se trece la linie nou. Dac fluxul este cu descrcare automat, metoda println() provoac, de
asemenea, descrcarea acestuia (flush).
Clasa PrintWriter
Constructori:
public PrintWriter(Writer out) - creeaz un nou flux de formatare pentru afiare, fr descrcare
automat, conectndu-l la fluxul de ieire pe caractere out;
public PrintWriter(Writer out, boolean autoFlush) - la fel ca i constructorul precedent, dar al doilea
argument specific dac are loc descrcarea automat a fluxului;
public PrintWriter(OutputStream out) - creeaz un nou flux de formatare pe caractere, fr
descrcare automat, conectndu-l la fluxul de ieire pe octei out; el creeaz i un OutputStreamWriter
48
intermediar, care face conversia caracterelor pe unul sau doi octei, dependent de platform;
public PrintWriter(OutputStream out, boolean autoFlush) - la fel ca i constructorul precedent, dar al
doilea argument indic dac se face descrcare automat a fluxului.
49