Utilizarea claselor din pachetul java.lang

Pachetul java.lang conține clasele fundamentale și există pe orice platformă Java. Pentru acest pachet nu este necesară declarația import, clasele sale fiind importate implicit. Lista completă a claselor din pachetul java.lang și descrierea lor se găsesc în documentația Java API de pe Internet. Noi vom prezenta aici câteva clase mai frecvent utilizate.
 

Clasa Object

Clasa Object este rădăcina 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, instanțele clasei Object sunt obiecte oarecare, fără atribute precizate. Variabilele referință la Object se folosesc atunci când, la elaborarea programului, se consideră că lor li se pot da ca valori referințe la orice fel de obiecte, indiferent de clasa căreia îi aparțin.

Î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 acțiuni specifice acestor clase.

Metodele clasei Object

Clasa Object nu are date membre. În consecință, obiectele acestei clase nu au stare (cu excepția faptului ce ele există sau nu).
Clasa are un singur constructor, Object(), care nu are parametri. Obiectele acestei clase nu conțin date. În schimb, clasa dispune de un set de metode. Conform cu principiul moștenirii, toate celelalte clase posedă metodele clasei Object.

Metodele clasei  Object sunt descrise în Java API. Noi vom prezenta aici numai o parte dintre ele, care vor fi utilizate în cele ce urmează.

Metoda equals() este declarată sub forma:

    public boolean equals(Object obj)

ceeace înseamnă că nivelul de acces este public, valoarea întoarsă (valoarea obținută la evaluarea acestei funcții) este de tip boolean, iar unicul argument aparține clasei Object. Expresia  a.equals(b) în care  a șb sunt două obiecte, întoarce valoarea  true dacă  a este identic cu b și valoarea  false în caz contrar.

Așa cum este ea definită în clasa Object, metoda equals() întoarce valoarea true numai dacă cele doua obiecte comparate sunt cu adevărat identice, adică au aceeași adresă în memorie, ceeace se poate scrie și sub forma expresiei  a==b. În clasele derivate, această metoda poate fi redefinită, respectând principiul polimorfismului, astfel încât să compare cele două obiecte după conținut, chiar dacă ele nu au aceeași referință.
 
Metoda hashCode() este declarată sub forma 

    public int hashCode()

și întoarce codul de dispersie al obiectului căruia i se aplică. Codul de dispersie (engleză: hash code) este un număr întreg (de tip int) care are următoarele proprietăți: 
    - dacă se aplică de mai multe ori aceluiași obiect, metoda hashCode() întoarce de fiecare dată același cod de dispersie; 
    - dacă două obiecte sunt egale între ele în sensul definit prin metoda equals(), atunci codurile de dispersie obținute aplicând metoda hashCode() fiecăruia în parte trebuie să fie, de asemenea, egale; 
    - este posibil ca, aplicând metoda hashCode() la doua obiecte diferite, să se obțină coduri de dispersie egale, însa este preferabil ca această situație să se întâlnească cât mai rar cu putință. 
 
Metoda hashCode() este utilă atunci când obiectele trebuie plasate în tabele de dispersie, cum sunt cele care fac parte din clasa java.util.Hashtable și java.util.HashMap.

Metoda toString() este declarată sub forma

    public String toString()

și întoarce reprezentarea sub forma de șir de caractere (de obiect din clasa String) a obiectului căruia i se aplică. Asa dar, expresia a.toString(), în care  a este un obiect, întoarce reprezentarea sub forma de șir a obiectului  a. În cazul obiectelor aparținând clasei Object, aceasta metodă întoarce un șir de forma  java.lang.Object@<cod_dispersie> în care <cod_dispersie> este codul de dispersie al obiectului respectiv, exprimat în hexazecimal. În clasele derivate aceasta metodă este redefinită, astfel încât să se obțină o reprezentare sub formă de șir a conținutului obiectului respectiv.
 
Metoda clone() este declarată sub forma: 

    protected Object clone()

și are rolul de a întoarce o clonă a obiectului căruia i se aplică, deci întoarce un obiect identic cu acesta, dar situat la o altă adresă de memorie și deci având o altă referință. În consecință, după ce se execută instrucțiunea 

    b=a.clone();

în care  a și b sunt referințe la obiecte, expresia a==b va avea valoarea false, deoarece valorile variabilelor referință a și  b sunt diferite, în timp ce expresia a.equals(b) va întoarce în mod normal valoarea true, deoarece cele două obiecte comparate au conținuturi identice. 

În schimb, după ce se execută instrucțiunea 

    b=a;

variabila b va avea ca valoare aceeași referință ca și variabila a, adica a și b vor indica același obiect din memorie, astfel că expresia a==b întoarce valoarea true.

Întrucât metoda clone() este protejată (are nivelul de acces protected) ea nu poate fi utilizată decât  pentru obiectele din clasa Object. În schimb, ea poate fi redefinită la clasele descendente, astfel încât sa devină publică. 

Metodele prezentate aici (exceptând, desigur, metoda clone()) sunt testate în programul din fișierul TestObject.java.

Metoda getClass() este declarată sub forma

    public final Class getClass()

O expresie de forma  a.getClass(), în care  a este o referinta la un obiect, întoarce ca valoare un obiect din clasa Class, care conține informații despre clasa obiectului indicat de variabila a. Deocamdată vom folosi această metoda numai pentru a afișa numele clasei, ca în ultimele trei instrucțiuni ale programului din fișierul TestObject.java.

Clase de excepții

În pachetul java.lang există și numeroase clase de excepții. Instanțele acestor clase sunt creeate de către mașina virtuală Java atunci când se produce o excepție, adică o situație anormală în procesul de calcul. Toate aceste clase sunt descrise în documentatia Java API. Vom menționa aici numai două dintre ele, celelalte urmând să fie indicate la descrierea claselor care conțin metode care pot genera excepții.
 
În limbajul Java se face distincție între excepție și eroare. Se consideră ca excepțiile sunt incidente care pot fi captate prin mecanismul try .. catch și pot fi deci tratate prin program, în timp ce erorile sunt incidente grave, care - de regulă - nu pot fi tratate prin program ci produc oprirea executării acestuia.

Clasa Exception

Această clasă este rădăcina ierarhiei claselor de excepții. În consecință, atunci când dorim ca in clauza catch sa fie captată orice fel de excepție, scriem această clauză sub forma

    catch(Exception e) {
       instructiuni_de_tratare_a_exceptiei e
    }

unde e este numele simbolic (identificatorul) dat excepției captate. Clasa are doi constructori:

public Exception()
    creează un obiect din clasa Exception (deci "o excepție") care nu conține nici un mesaj.

public Exception(String s)
    creează un obiect din clasa Exception, care conține un mesaj sub forma șirului s. Prin acest mesaj se indică, de regulă, ce incident a condus la generarea excepției respective.

Vom arăta ulterior cum putem folosi acești constructori pentru a genera propriile noastre excepții.

Clasa Exception nu are propriile ei metode.Totuși, atât pentru clasa Exception, cât și pentru toate celelalte clase de excepții se pot folosi metodele superclasei Object. În particular, se poate folosi pentru instanțele oricărei clase de excepții metoda toString(), care pune instanța respectivă sub forma unui șir de caractere. Acest șir conține, de  regulă, un mesaj privind felul exceptiei respective.

Clasa ArithmeticException

Instanțele acestei clase sunt generate de mașina virtuală Java atunci când are loc o situație anormală la efectuarea unei operații aritmetice, cum ar fi, de exemplu, împărțirea la zero a unui număr întreg. Instanța respectivă conține un mesaj care indică ce fel de excepție s-a produs.

Exemple de utilizare a claselor de excepții s-au dat deja în capitolul "Tratarea excepțiilor".



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați