Documente Academic
Documente Profesional
Documente Cultură
1. Pachete
Scopul lucrării
Această lucrare are ca scop prezentarea noţiunii de pachet în vederea folosirii bibliotecilor de
clase precum şi dezvoltării sistematice de aplicaţii mari.
Un concept important în Java este acela de package (pachet). Spre deosebire de C, aici nu
există directive preprocesor de nici un fel. Rolul directivei #include este preluat de instrucţiunea
import. Un pachet este o colecţie de clase care devin accesibile în fişierul sursă care le importă. Spre
deosebire de C, aici declaraţiile şi definiţiile nu sunt separate în fişiere separate (.h pentru headere şi .c
respectiv .cpp pentru implementare). O clasă este declarată şi definită în acelaşi loc.
De asemenea s-a eliminat un alt neajuns al limbajului C: acela de a recompila toate sursele
care includ un header modificat. Aici sursa pachetelor nu se inserează în textul sursă, ci se încarcă
clasele necesare din pachetul corespunzător. Regăsirea claselor şi a metodelor se face pe baza numelui
şi nu a adresei, astfel că se pot modifica pachetele fără a fi necesară recompilarea surselor ce le
importă (cu condiţia ca acestea să ofere clase şi metode cu acelaşi nume şi semnătură ca în varianta
anterioară).
Referitor la denumirea pachetelor s-a propus o schemă de denumire unitară, în care fiecare
pachet poate fi identificat în mod unic pornind de la adresa Internet a proiectantului pachetului.
Fie spre exemplu următoarea adresă de e-mail: atoth@cs.uoradea.ro. Pe sistemul de fişiere
local fişierul Test.class se află în directorul /ro/uoradea/cs/atoth. Denumirea fişierului este:
ro.uoradea.cs.atoth.Test. Se observă ordonarea inversă a domeniilor: întâi ro, apoi uoradea ş.a.m.d.
Limbajul Java dispune de o puternică bibliotecă de pachete elaborată de firma Sun. În Tabelul
1 se prezintă câteva dintre acestea:
Denumire Descriere
java.applet clase folosite pentru implementarea
appleturilor
java.lang clase pentru nucleul limbajului
java.math clase folosite în calcule aritmetice
java.net clase pentru lucrul în reţea
java.util diferite clase implementând tipuri des
folosite
Tabelul 1
Instrucţiunea import permite accesul la anumite clase aparţinând unui pachet. Fie
exemplul următor:
import java.util.Hashtable;
import java.math.*;
Prima instrucţiune importă o singură clasă (Hashtable) din pachetul specificat (java.util). A
doua importă toate clasele aparţinând pachetului java.math.
După ce au fost importate, clasele se pot referi în felul următor:
java.util.Hashtable ht;
Exemplul de mai sus declară o instanţă a clasei java.util.Hashtable. Se observă
specificarea completă a clasei, cu numele pachetului urmat de numele clasei. Uzual se
preferă forma prescurtată (în caz că nu există ambiguităţi) :
Hashtable oTabela;
Pachetul java.lang este cel mai important pachet Java. El este importat implicit în toate
programele şi conţine clase vitale pentru funcţionarea maşinii virtuale şi interfaţa sa cu sistemul de
operare. Printre acestea se numără clase însărcinate cu implementarea sistemului de securitate, cu
încărcarea claselor (din fişiere, reţea), legătura cu resurse sistem de tipul proceselor, firelor de execuţie
(threads).
Una dintre cele mai importante clase ale pachetului java.lang este java.lang.System. Aceasta
nu poate fi instanţiată, dar conţine o serie de metode şi câmpuri statice, printre care se numără fluxurile
standard de intrare, ieşire şi fluxul de eroare. Printre metode se aminteşte în special exit, care serveşte
la terminarea aplicaţiei curente (a se observa diferenţa între aplicaţie şi applet).
În aproape toate exemplele de până acum s-a folosit metoda print :
System.out.print(“Hello” + “\n”);
System.out.println(“Bye”);
O altă clasă esenţială, întâlnită deja (vezi paragraful Error: Reference source not found) este
String. Această clasă foloseşte la lucrul cu entităţi de tip şir de caractere constante. Clasa String are o
mare varietate de constructori pentru iniţializarea din alt şir de caractere, din tablouri de caractere
şamd.
Printre metodele clasei String se amintesc:
compareTo şi compareToIgnoreCase pentru compararea cu un alt şir de caractere sau
chiar obiect;
startsWith, endsWith, substring, lastIndexOf, indexOf, replace pentru căutarea
/modificarea de subşiruri de caractere;
valueOf pentru convertirea tipurilor primitive uzuale în şir de caractere;
toUpperCase, toLowerCase, trim implementează funcţii uzuale de schimbare a literelor mici /
mari şi de eliminare a spaţiilor.
În secvenţele de program de până acum s-a putut observa concatenarea la şiruri de caractere a
unor variabile de alt tip. Acest lucru este posibil datorită faptului că în clasa Object (care este strămoşul
direct sau indirect al oricărei clase) este definită metoda toString, care realizează o conversie spre tipul
String. Se recomandă redefinirea acestei metode de către programatori.
class Orice {
int i;
String sir;
System.out.println(o);
}
}
Spre deosebire de clasa String care manipulează şiruri constante, clasa StringBuffer este
destinată şirurilor de caractere variabile. Metodele sale permit adăugarea, inserarea şi înlocuirea unor
caractere sau sub-şiruri dintr-o instanţă. Următorul exemplu ilustrează folosirea clasei StringBuffer:
class StrBufApp {
public static void main(String argv[ ]) {
/** Constructia dintr-un String */
StringBuffer buf = new StringBuffer("ABC");
/** Adaugare cu metoda append */
buf.append("DEF");
System.out.println(buf);
În continuare se vor prezenta câteva metode ale clasei Integer. Aceasta este o clasă derivată
din clasa Number, de la care moşteneşte metode abstracte pentru transformarea din / în şir de caractere.
Exemplul de mai jos poate fi uşor adaptat la restul claselor denumite “type wrappers”: Byte, Float etc.
class IntApp {
public static void main(String argv[ ]) {
String unSir = new String("123");
try {
/** Constructori */
Integer unInt = new Integer("1234");
/**Atenţie la secvenţele escape: \" şi \t ! */
System.out.println("Integer(\"1234\") : \t\t" + unInt.intValue() );
unInt = new Integer(12);
System.out.println("Integer(12) : \t\t\t" + unInt.intValue() );
} catch (Exception e) {
System.out.println("A aparut urmatoarea exceptie:" + e);
System.exit(-1);
}
}
}
În această clasă sunt grupate echivalentul funcţiilor C care se află în fişierul math.h. Pentru a
se asigura deplina portabilitate, implementarea respectă standardul IEEE 754. Toate metodele sunt
statice, la fel ca şi constantele double E şi PI. Se atrage atenţia asupra faptului că marea majoritate a
acestor metode folosesc reprezentarea numerelor în virgulă mobilă în dublă precizie (double) şi nu
float. Exemplul următor prezintă câteva dintre metodele clasei Math.
class MathApp {
public static void main(String argv[ ]) {
double d = Math.sin(0.2456);
d = Math.sqrt(2453);
d = Math.max(23434, Math.exp(7));
/** functia putere */
d = Math.pow(13.543456, -6.65245);
/** Conversii radiani <-> grade */
d = Math.toDegrees(Math.PI/4);
}
}
Un alt pachet destinat dezvoltării rapide de programe este java.util. Printre clasele sale se
numără: vectori, stive, tabele de dispersie (hashtables). Noţiunea de vector este des întâlnită în ultimul
timp în cadrul diferitelor limbaje de programare. Un vector reprezintă un tablou de elemente oarecare,
acest tablou având însă capacitate variabilă. Creşterea capacităţii se face prin simpla adăugare a unui
nou element. Alocarea memoriei se face în mod transparent. Deobicei vectorii oferă posibilitatea
declarării unei capacităţi iniţiale şi a unui increment (cu câte unităţi va creşte capacitatea atunci când se
mai adaugă un element care “nu mai încape” ).
În următorul exemplu se va folosi un vector de elemente aparţinând clasei Nota (s-ar fi putut
folosi şi elemente de tipuri primitive: int, String). Se observă cei doi constructori ai clasei Nota. Clasa
VectorApp conţine metoda main. Din cauză că această metodă este statică, ea poate apela / accesa doar
funcţii / câmpuri statice, lucru ce explică prezenţa modificatorului de acces.
import java.util.Vector;
class Nota {
public String disciplina;
public int nota;
public Nota( ) {
nota = 1;
}
1111…11
2222…2
…
N
Să se scrie un program care adună două matrici pătrate de ordin N. Matricile vor fi
iniţializate folosind funcţia math.random(), care întoarce un număr double ce ia valori în
intervalul (0..1).