Documente Academic
Documente Profesional
Documente Cultură
Java este un concept care include mai multe înţelesuri. În primul rînd Java este un
limbaj de programare orientat pe obiecte. El a fost dezvoltat de către o echipă de la
Sun Microsystems condusă de James Gosling (1990-1993). Iniţial, numele limbajului
de programare a fost 'Stejarul' (numele copacului din faţa biroului lui Gosling), dar
cum exista un alt limbaj cu acelaşi nume a fost redenumit Java, după numele cafenelei
de lîngă sediul Sun Microsystems. În 1993, ca urmare a dezvoltării World Wide Web,
la Sun a fost creat un browser numit la început WebRunner iar apoi HotJava.
Java se prezintă şi sub forma unei maşini virtuale care execută instrucţiunile pe care le
generează compilatorul Java. Această maşină virtuală (sau mediu "run time") poate fi
încorporată în diverse produse cum sînt browser-ele Web sau în nucleul unor sisteme
de operare (OS/2, Windows NT).
În plus, Java este constituit din biblioteci de clase (sau "pachete" în terminologia
Java). Fiecare din aceste biblioteci de clase este dedicată unui anumit domeniu. Unele
biblioteci de clase sînt construite pentru lucrul cu GUI, altele controlează lucrul în
multimedia sau pe reţele.
Sintaxa Java seamănă foarte mult cu cea a limbajului C++. Java utilizează
sintaxa similară din C++ pentru instrucţiuni 'if' şi 'while' şi de asemenea pentru
alţi constructori de control. De asemenea, structura sintaxei Java conţine clase,
metode (în loc de funcţii membre) şi acces protejat (private, public, protected).
Noţiunea de 'constructor' în Java este similară cu cea din C++.
Deci, limbajul Java are cîteva caracteristici pe care le are şi limbajul C++.
În plus faţă de C++, limbajul Java are două proprietăţi care îl fac mai puternic
decît acesta, şi anume, dă posibilitatea programatorului să construiască fire de
execuţie şi să sincronizeze metode.
În spatele limbajului Java este Maşina Virtuală Java (MVJ) care reprezintă un
element important al tehnologiei Java (în engl. Java Virtual Machine).
Cum am menţionat anterior, MVJ poate fi cuprinsă într-un mediu oarecare. Odată ce o
parte de cod Java este încărcată într-un mediu, ea este verificată. Din procesul de
încărcare face parte invocarea unui "încărcător de clasă" care face verificarea codului-
octet. Acesta este un cîştig din punctul de vedere al securităţii deoarece prin această
verificare se asigură faptul că maşina pe care este încărcat codul generat de compilator
(sau provenit de la orice altă sursă) nu este deranjată (coruptă) de către acesta.
Mediu
javac
Sursa Java Cod-octet MV Java
Java
.java
.class
Codul sursă Java se găseşte într-un fişier .java care va fi prelucrat cu un compilator
Java (javac). Compilatorul Java produce un fişier .class care va conţine codul-octet.
Acest fişier .class va fi încărcat pe reţea sau local pe maşina curentă
în mediul de execuţie de pe platforma respectivă. MVJ este cuprinsă în acest mediu şi
interpretează şi execută codul octet.
Un program în Java este compilat în codul-octet a cărui arhitectură ţintă este MVJ;
Maşina virtuală este cuprinsă în alte medii (web browser, sistem de operare);
MVJ utilizează un verificator de cod atunci cînd citeşte cod-octet; 'Class Loader'
încarcă clasele peste reţea şi măreşte astfel securitatea procesului.
Una dintre bibliotecile de clase este biblioteca GUI (graphical user interface) bazată pe
ferestre. Numele acestei biblioteci de clase este setul abstract de unelte de lucru
(toolkit) bazat pe ferestre (AWT - abstract window toolkit). Cu ajutorul său se pot crea
butoane, etichete, cîmpuri de text, etc. Acestea au calitatea, apreciată de mulţi
utilizatori, de a fi uşor de folosit.
O altă bibliotecă de clase se referă la imagini şi prelucrări de imagini şi permite
crearea imaginilor care provin din fişiere .gif sau .jpeg. De asemenea, se mai pot
realiza prelucrări de imagini (filtrări sau manipulări de imagini). Prin intermediul
acestei biblioteci de clase se realizează prelucrarea fişierelor audio (redare, buclare,
oprire).
O bibliotecă de clase importantă este cea care cuprinde integrarea în reţea, un subiect
major în conexiune cu prelucrările Java. Cea mai importantă proprietate este cea de a
permite utilizarea adreselor URL (Uniform Resource Locators) pentru a ieşi în reţeaua
Internet după o anumită informaţie care poate fi adusă apoi pe maşina locală. În plus
faţă de utilizarea URL-urilor (la un nivel mai scăzut) se mai pot crea intrări (sockets)
folosind protocolul TCP/IP. Această bibliotecă de clase este asociată cu mediile de
operare şi interfeţele către alte platforme cu care lucrează Java. Acestea sînt servicii
bazate pe Internet şi deci se poate lucra cu servicii Internet de interes general cum sînt
FTP şi gopher.
Ferestrele GUI
Set complet de clase bazate pe ferestre standard GUI
Uşor de utilizat pentru a construi clienţi GUI
Imagini şi audio
Suport pentru crearea de imagini din .gif, .jpeg, etc.
Includ interfeţe pentru a suporta filtre de prelucrare a imaginilor
Applet-urile pot reda fişiere audio
Lucrul în reţea
Suport pentru aducerea fişierelor, imaginilor, etc. utilizînd URL
Sistem-suport pentru intrări de flux, furnizînd acces la serviciile bazate pe
Internet
Maşina virtuală, în conexiune cu Internet poate încărca dinamic clasele pe
reţea.
O clasă poate fi asemănată unui model (sau şablon) care defineşte un obiect. Clasa
defineşte modul în care
42 Noţiuni introductive despre Java - 3
Exemplu: O
formă de
prăjitură (clasa)
care se aplică şi
taie
(instanţiere)
dintr-o bucată
mai mare şi
scoate prăjituri
(obiecte) care
pot fi diferite
totuşi ca
parametri.
Pentru a afla
cum e
umplutura
prăjiturii
trebuie să pătrundem din afară în interior. Astfel se pune în practică principiul
încapsulării, ca principiu de bază al POO.
Fig. 3.2. Exemplu grafic cu elemente ale limbajului Java
În Fig. 3.2. se prezintă o reprezentare grafică a uni obiect Java numit Punct. În
interiorul cercului sînt precizate două valori pentru coordonatele x şi y. Cel mai
adesea, datele sau valorile (variabilele instanţiate) se află în centrul cercului. În afara
sa sînt poziţionate funcţiile pe care le va avea (metodele). În Fig. 3.2. apare metoda
numită distantaDeLa poziţionată la baza cercului. x şi y din interiorul cercului sînt
încapsulate în obiect (ascunse, izolate) şi singurul mod în care se pot afla informaţii
despre ceea ce se găseşte în centrul cercului este pătrunderea din exterior. Acesta este
un principiu de bază al programării orientate pe obiect (v. Capitolul 2).
Modul de programare în Java este asemănător cu cel din C++ (ceea ce pot remarca cu
uşurinţă cei care cunosc limbajul C++).
Urmărind această secvenţă de cod Java se pot evidenţia elementele limbajului Java:
44 Noţiuni introductive despre Java - 3
Se consideră obiectul constituit dintr-un cont de bancă (Fig. 3.3.). Numele clasei este
scris deasupra cercului, ContBancar, iar numele obiectului, rezultat al instanţierii, este
scris sub cerc, aCB. În interiorul cercului sînt plasate două piese de informaţie:
variabile instanţiate sau date: un cîmp id şi o balanta. În jurul variabilelor sînt plasate
metodele (care dau comportamentul obiectului). Metodele implementează orice funcţii
necesare. În cazul unui cont bancar este vorba de: depuneri, retrageri şi alte funcţii
utile pentru accesul la informaţii despre id şi balanţă.
depunere()
O proprietate tipică limbajului Java este modalitatea de preluare a unui şir pentru un
obiect, folosind toString. Acesta preia conţinutul intern al unui obiect şi furnizează un
şir care poate fi tipărit. De asemenea, se poate folosi şi pentru operaţiuni de diagnoză.
Deci,
datele
corpul metodei, care reflectă aspectul de calcul din metodă (şi imprimă
comportamentul obiectului)
în afara obiectului este:
identitatea obiectului (numele variabilei sau instanţei); în exemplu
identitatea obiectului este dată prin aCB şi reprezintă un cont bancar.
Identitatea este legată de adresa obiectului. Toate obiectele sînt unic
identificate prin adresa lor. Adresa de memorie este diferită pentru diferite
piese de date.
interfaţa obiectului aflată într-o anumită conexiune cu comportamentul
său; pentru exemplul din Fig 3.3. aceasta înseamnă că există o metodă de
depunere care nu foloseşte parametri şi returnează un anumit tip de
rezultat, o metodă de retragere, dar fără precizarea corpului metodei, este
doar o "semnătură" a metodei. Pe parcurs, se va aprofunda conceptul de
interfaţă, legat de programarea orientată pe obiect.
Codul sursă pentru programul simplu care descrie cîteva operaţii legate de un cont
bancar este prezentat în continuare. El are ca scop doar o prezentare de "sus" a
problemelor de programare Java astfel încît să creeze o idee generală asupra
posibilităţilor de programare în acest limbaj fără să intre în probleme de sintaxă care
vor fi prezentate pe larg în capitolele următoare.
// variabile instanţe
private double balanta_;
private int id_;
46 Noţiuni introductive despre Java - 3
System.out.println("a=" + a.toString() );
System.out.println("b=" + b.toString() );
a.retragere(50000);
b.depunere(300000);
System.out.println("a=" + a);
System.out.println("b=" + b);
System.exit(0);
} // fără punct şi virgulă
}
Această clasă poate fi definită public, ceea ce înseamnă că poate fi "exportată" în afara
bibliotecii de clase curente (în care este definită). Numele clasei este ContBancar. Se
observă că în numele clasei pot să apară litere mari, ceea ce conferă claritate numelui.
Definiţia clasei începe cu o acoladă deschisă - { - şi se termină cu o acoladă închisă - }
- la finalul secvenţei prezentate.
În primul rînd se definesc aşa numiţii constructori care reprezintă metodele publice.
Constructorii sînt un tip special de metode avînd acelaşi nume ca şi clasa în care se
3.5. - Elemente de tehnologie Java 47
În cazul de faţă this este urmat de 0.0 în paranteze. În acest mod cu un constructor se
invocă un alt constructor. Constructorul acesta nu are nici un argument şi invocă un
argument de constructor pasîndu-i o valoare implicită.
Java nu are argumente implicite, ca şi C++, deci aceasta este o modalitate de a-i
crea şi această facilitate.
Acesta are un singur argument, de tip double, care reprezintă valoarea iniţială a
balanţei, iar în corpul funcţiei (între acolade) se atribuie pentru balanta_ aceasta
valoare iniţială. De asemenea, se face şi atribuirea cîmpului de identificare, id_.
Funcţia următoare este una specială şi are ca rezultat conversia unei date într-un obiect
de tip şir de caractere (string) şi se numeşte toString.
Următoarele două linii din program se referă la două variabile instanţe: balanta_ şi
id_. Prima este de tip double, iar cea de a doua de tip întreg. Double şi int sînt cuvinte
rezervate care reprezintă tipuri. Acestea vor fi prezentate în capitolul următor.
Deocamdată trebuie reţinut că variabilele pot fi reprezentate pe mai mulţi octeţi şi
aceste reprezentări poartă diferite denumiri.
// variabile instanţe
private double balanta_;
private int id_;
Acest mod de lucru se deosebeşte de cel în C++ unde există un fişier header şi un
fişier cu cod sursă. În Java totul este într-un fişier, combinîndu-se cele două
structuri, declaraţia şi iniţializarea.
După variabila clasei urmează metoda cu numele newID care este o metodă a clasei şi
face referinţă la variabila clasei. Funcţia ei este de a returna şi incrementa nextID_ .
Aceasta înseamnă că, ori de cîte ori se construieşte o clasă se va începe cu valoarea
100, va continua cu 101, ş.a.m.d.
Aceasta este metoda main. Se putea construi o clasă separată care să conţină metoda
main. Atunci cînd se execută aplicaţia utilizînd comenzi Java se face verificarea dacă
există metoda main în interiorul clasei. Dacă metoda main este cu semnătura
corespunzătoare, adică este publică, atunci returnează void şi preia un tablou de şiruri
de caractere (String args[]).
Prima dată, în corpul metodei main se definesc două conturi bancare, ContBancar 'a' şi
ContBancar 'b' şi se creează pentru ele obiectele corespunzătoare.
Primul obiect are un argument cu valoarea 110 000, iar cel de-al doilea nu are nici un
argument. Revenind la codul prezentat anterior se reaminteşte că prima linie, 'a',
specifică un argument şi invocă al doilea constructor menţionat anterior. Cea de-a
doua intrare, 'b', va invoca primul constructor care folosind this(0.0) va invoca cel de-
al doilea constructor, determinînd o cascadă de invocări. Rezultatul sînt două obiecte
care reprezintă conturi bancare, 'a' şi 'b'. 'a' şi 'b' nu sînt ele însele obiecte, ci variabile
care fac referinţă la obiecte.
System.out.println("a=" + a.toString() );
System.out.println("b=" + b.toString() );
System este o clasă, out este o variabilă a clasei (un PrintStream) şi println este o
metodă care scrie un şir la consolă. Şirul este argumentul pasat metodei println: "a="
urmat de semnul plus, +, care realizează concatenarea cu a.toString(). Rezultatul
tipăririi va fi: a = cu orice va conţine toString asociat lui ContBancar. Sarcina sa este
aceea de a tipări ceea ce creează super.toString() şi apoi să tipărească valoarea id şi a
balanţei. Cea de a doua linie are acelaşi efect, dar pentru ContBancar 'b'.
Următoarele metode sînt cele de retragere şi depunere pentru conturile 'a' şi 'b'.
a.retragere(50000);
b.depunere(300000);
System.out.println("a=" + a);
System.out.println("b=" + b);
Se remarcă faptul că există o convenţie prin care, dacă trebuie convertit ceva în şir de
caractere, metoda toString este invocată implicit, deci nu mai e nevoie să fie
specificată explicit. Acest fapt simplifică codul şi îl face mai uşor de citit. Deci se va
scrie doar "a="+a.
System.exit(0);
o ieşire pe un cod zero. System este o clasă generală, intens folosită, iar exit determină
oprirea MVJ şi terminarea programului.
Unul din marile avantaje ale utilizării limbajului Java este portabilitatea, independenţa
sa faţă de platforma pe care se execută. Nu numai sintaxa este importantă în Java. Un
3.5. - Elemente de tehnologie Java 51
Cînd se încarcă pe o maşină cod Java (de undeva de pe reţea, ţinînd cont că maşina
virtuală poate fi înglobată într-un web browser), acesta este verificat. “Încărcătorul de
clase” este o parte importantă a procesului de încărcare care face şi verificarea codului
octet. Această verificare este cea care asigură securitatea procesului. Şi anume, codul
furnizat de către compilator (sau din orice altă sursă) nu va influenţa negativ
(“corupe”) maşina pe care a fost încărcat. Verificarea codului octet se face la sfîrşitul
compilării pentru a asigura asupra faptului că rezultă un cod corect şi sigur.
Verificarea codului octet este prima acţiune pe care o face încărcătorul de clase.
Acţiunea aceasta de verificare este necesară deoarece utilizarea limbajului Java pe
Internet implică şi transferul (download) unor programe de pe diverse maşini de pe
Internet pe maşina pe care lucrăm.
52 Noţiuni introductive despre Java - 3
MVJ, Java Runtime, se află în legătură cu clasele care au fost încărcate şi foloseşte
fişiere de tip *.dll care sînt special implementate pentru mediul utilizat. Deci, codul
Java este independent de mediul pe care se încarcă. El se execută în cod octet fără să
ţină cont de arhitectura de bază. Dar, fişierele de tip *.dll transferate pentru a
implementa MVJ, Java runtime, trebuie să cunoască arhitectura de bază. Acest proces
este cunoscut sub numele de interpretare. El presupune parcurgerea unor etape
(preluarea codului, decodificarea, execuţia fiecărui cod) care au o anumită durată.
Aceasta înseamnă un timp mai lung de prelucrare decît în cazul limbajelor procedurale
(de ex. C).
REZUMAT
Ferestre GUI
Set complet de clase bazate pe ferestre
standard GUI
Uşor de utilizat pentru a construi clienţi
GUI
Imagini şi audio
Suport pentru crearea de imagini din
prelucrare a imaginilor
Applet-urile pot reda fişiere audio
Lucrul în reţea
Suport pentru aducerea fişierelor,
imaginilor, etc. utilizînd URL
Sistem-suport pentru intrări de flux,
furnizînd acces la serviciile bazate pe
Internet
Instrumentul virtual în conexiune cu
Internet poate încărca dinamic clasele pe
reţea.
Limbajul Java este un limbaj de programare
orientat pe obiecte, deci lucrează cu obiecte, clase şi
utilizează moştenirea.
3.5. - Elemente de tehnologie Java 55