Prezentarea mediului Java

19
1 1. Prezentarea mediului Java 1.1. Introducere Limbajul Java împreună cu mediul său de dezvoltare şi execuţie au fost proiectate pentru a rezolva o parte dintre problemele actuale ale programării. Proiectul Java a pornit cu scopul declarat de a dezvolta un software performant pentru aparatele electronice de larg consum. Aceste echipamente se definesc ca fiind: mici, portabile, distribuite şi lucrând în timp real. De la aceste aparate, ne-am obişnuit să cerem fiabilitate şi uşurinţă în exploatare. Rădăcinile limbajului Java se află într-un proiect de cercetare (proiectul “Green”) al firmei SUN. Coordonator de proiect este numit James Gosling, unul din veteranii designului software-ului de reţea. Menirea proiectului era aceea de a crea obiecte casnice “deştepte” şi de a le face să comunice unele cu altele. Limbajul luat iniţial în considerare a fost C++. Se pare însă că C++ nu a fost limbajul care să satisfacă cerinţele unui astfel de proiect. Ca urmare, James Gosling dă naştere unui nou limbaj care îl va face mai târziu celebru. La început limbajul se numea “Oak”, în cinstea arborelului din faţa ferestrei lui Gosling. În urma unei demonstraţii reuşite a proiectului, şi implicit a limbajului, firma Sun are o tentativă de a folosi acest limbaj în Interactive Television Industry, tentativă care va fi însă un eşec. Aceasta se întâmpla în 1994. În timp ce Green şi Oak îşi căutau cumpărătorii în domeniul Televiziunii Interactive, o nouă apariţie schimbă lumea Internet în primăvara lui 1993: Mark Andersen, încă student, lucrând la National Center for Supercomputing Applications (NCSA) lansează Mosaic 1.0, primul browser WWW grafic. Pierzând cursa în domeniul televiziunii interactive, Oak începe o alta în WWW. Echipa proiectează un nou browser WWW, numit Web Runner, cu capabilităţi de rulare a aplicaţiilor dezvoltate în limbajul Oak. E momentul în care Oak îşi schimbă numele în JAVA, marca Oak existând deja pe piaţă. Firma Netscape ajută lansarea limbajului Java prin cumpărarea licenţei şi integrarea lui în browser-ele Netscape. Java intră astfel în cursa limbajelor de programare evoluate. Astfel, în noiembrie 1995 este disponibilă prima versiune Beta a limbajului Java. De atunci limbajul se află într-o continuă ascensiune trecând de la versiunea 1.0 (în 1995) la 1.1 (în 1997), la 1.2 (în 1998) şi în acest moment la 1.3 (în 2000), versiunea 1.4 fiind de tip beta (vara 2001). Fiecare versiune implementează noi concepte şi noi unelte care îşi fac apariţia în lumea Java. Rezultatul este surprinzător în lumea software. Java se profilează ca un limbaj, un mediu de programare puternic, o tehnologie a viitoarelor dezvoltări software. În acest moment cele mai mari firme de software au cumpărat licenţa

description

Cuprins:1. Introducere2.Tehnologia Java3.Limbajul de programare Java4.Platforma Java5. Aplicații în Java6.Descrierea pachetului JDK7.Pachete de bază JDK 1.3.8.Descrierea limbajului Java prin comparație cu limbajul C/C++

Transcript of Prezentarea mediului Java

Page 1: Prezentarea mediului Java

1

1. Prezentarea mediului Java

1.1. Introducere

Limbajul Java împreună cu mediul său de dezvoltare şi execuţie au

fost proiectate pentru a rezolva o parte dintre problemele actuale ale

programării. Proiectul Java a pornit cu scopul declarat de a dezvolta un

software performant pentru aparatele electronice de larg consum. Aceste

echipamente se definesc ca fiind: mici, portabile, distribuite şi lucrând în timp

real. De la aceste aparate, ne-am obişnuit să cerem fiabilitate şi uşurinţă în

exploatare.

Rădăcinile limbajului Java se află într-un proiect de cercetare

(proiectul “Green”) al firmei SUN. Coordonator de proiect este numit James

Gosling, unul din veteranii designului software-ului de reţea. Menirea

proiectului era aceea de a crea obiecte casnice “deştepte” şi de a le face să

comunice unele cu altele. Limbajul luat iniţial în considerare a fost C++. Se

pare însă că C++ nu a fost limbajul care să satisfacă cerinţele unui astfel de

proiect. Ca urmare, James Gosling dă naştere unui nou limbaj care îl va face

mai târziu celebru. La început limbajul se numea “Oak”, în cinstea arborelului

din faţa ferestrei lui Gosling. În urma unei demonstraţii reuşite a proiectului, şi

implicit a limbajului, firma Sun are o tentativă de a folosi acest limbaj în

Interactive Television Industry, tentativă care va fi însă un eşec. Aceasta se

întâmpla în 1994. În timp ce Green şi Oak îşi căutau cumpărătorii în domeniul

Televiziunii Interactive, o nouă apariţie schimbă lumea Internet în primăvara

lui 1993: Mark Andersen, încă student, lucrând la National Center for

Supercomputing Applications (NCSA) lansează Mosaic 1.0, primul browser

WWW grafic. Pierzând cursa în domeniul televiziunii interactive, Oak începe o

alta în WWW. Echipa proiectează un nou browser WWW, numit Web Runner,

cu capabilităţi de rulare a aplicaţiilor dezvoltate în limbajul Oak. E momentul în

care Oak îşi schimbă numele în JAVA, marca Oak existând deja pe piaţă.

Firma Netscape ajută lansarea limbajului Java prin cumpărarea licenţei

şi integrarea lui în browser-ele Netscape. Java intră astfel în cursa limbajelor de

programare evoluate. Astfel, în noiembrie 1995 este disponibilă prima versiune

Beta a limbajului Java. De atunci limbajul se află într-o continuă ascensiune

trecând de la versiunea 1.0 (în 1995) la 1.1 (în 1997), la 1.2 (în 1998) şi în acest

moment la 1.3 (în 2000), versiunea 1.4 fiind de tip beta (vara 2001). Fiecare

versiune implementează noi concepte şi noi unelte care îşi fac apariţia în lumea

Java.

Rezultatul este surprinzător în lumea software. Java se profilează ca un

limbaj, un mediu de programare puternic, o tehnologie a viitoarelor dezvoltări

software. În acest moment cele mai mari firme de software au cumpărat licenţa

Page 2: Prezentarea mediului Java

2

Java de la firma Sun în vederea dezvoltării unor produse care consideră

tehnologia Java.

În primul rând, Java încearcă să rămână un limbaj simplu de folosit

chiar şi de către programatorii neprofesionişti, programatori care doresc să se

concentreze asupra aplicaţiilor în principal şi abia apoi asupra tehnicilor de

implementare a acestora. Această trăsătură poate fi considerată ca o reacţie

directă la complexitatea considerată a limbajului C++.

Au fost îndepărtate din Java aspectele cele mai derutante din C++

precum supraîncărcarea operatorilor şi moştenirea multiplă. A fost introdus un

colector automat de gunoaie (garbage collector) care să rezolve problema

dealocării memoriei în mod uniform, fără intervenţia programatorului.

Colectorul de gunoaie nu este o trăsătură nouă, dar implementarea acestuia în

Java este făcută inteligent şi eficient folosind un fir separat de execuţie, pentru

că Java are încorporate facilităţi de execuţie pe mai multe fire de execuţie

implicit. Astfel, colectarea gunoaielor se face de obicei în timp ce un alt fir

aşteaptă o operaţie de intrare-ieşire sau pe un semafor.

Limbajul Java este independent de arhitectura calculatorului pe care

lucrează, ceea ce îi conferă portabilitate. În loc să genereze cod nativ pentru o

platformă sau alta, compilatorul Java generează o secvenţă de instrucţiuni ale

unei maşini virtuale Java. Execuţia aplicaţiilor Java este interpretată. Singura

parte din mediul de execuţie Java care trebuie portată de pe o arhitectură pe alta

este mediul de execuţie cuprinzând interpretorul şi o parte din bibliotecile

standard care depind de sistem. În acest fel, aplicaţii Java compilate pe o

arhitectură SPARC de exemplu, pot fi rulate fără recompilare pe un sistem

bazat pe procesoare Intel.

Una dintre principalele probleme ale limbajelor interpretate este viteza

de execuţie, considerabil scăzută faţă de cea a limbajelor compilate. Dacă nu

este mulţumitoare viteza de execuţie a unei astfel de aplicaţii, se poate cere

mediului de execuţie Java să genereze automat, plecând de la codul maşinii

virtuale, codul specific maşinii pe care se lucrează, obţinându-se astfel un

executabil nativ care poate rula la viteză maximă. De obicei însă, în Java se

compilează doar acele părţi ale programului, mari consumatoare de timp, restul

rămânând interpretate pentru a nu se pierde flexibilitatea. Mediul de execuţie

însuşi este scris în C respectând standardele POSIX, ceea ce îl face extrem de

portabil.

Interpretorul Java a fost iniţial gândit să lucreze pe maşini mici,

precum ar fi procesoarele cu care sunt dotate aparatele casnice. Interpretorul

plus bibliotecile standard cu legare dinamică nu depăşesc 300 Kb. Chiar

împreună cu interfaţa grafică totul rămâne mult sub 1 MB, ceea ce îi conferă un

imens avantaj.

Limbajul Java este pur orientat obiectual. Cu el se pot crea clase de

obiecte şi instanţe ale acestora, se pot încapsula informaţiile, se pot moşteni

variabilele şi metodele de la o clasă la alta, etc. Singura trăsătură specifică

Page 3: Prezentarea mediului Java

3

limbajelor orientate obiect care lipseşte este moştenirea multiplă, dar pentru a

suplini această lipsă, Java oferă o facilitate mai simplă, numită interfaţă, care

permite definirea unui anumit comportament pentru o clasă de obiecte, altul

decât cel definit de clasa de bază printr-o implementare specifică a unei

interfeţe. În Java orice element este un obiect, în afară de datele primare. Din

Java lipsesc funcţiile şi variabilele globale. Ne rămân desigur metodele şi

variabilele statice ale claselor.

Java este distribuit, având implementate biblioteci pentru lucrul în

reţea care ne oferă TCP/IP, URL şi încărcarea resurselor din reţea. Aplicaţiile

Java pot accesa foarte uşor reţeaua, folosindu-se de apelurile către un set

standard de clase.

Java este robust. În Java legarea funcţiilor se face în timpul execuţiei

şi informaţiile de compilare sunt disponibile până în momentul rulării

aplicaţiei. Acest mod de lucru face ca sistemul să poată determina în orice

moment neconcordanţa dintre tipul referit la compilare şi cel referit în timpul

execuţiei evitându-se astfel posibile intruziuni răuvoitoare în sistem prin

intermediul unor referinţe falsificate. În acelaşi timp, Java detectează referinţele

nule dacă acestea sunt folosite în operaţii de acces. Indicii în tablourile Java

sunt verificaţi permanent în timpul execuţiei şi tablourile nu se pot parcurge

prin intermediul unor pointeri aşa cum se întâmplă în C/C++. De altfel,

pointerii lipsesc complet din limbajul Java, împreună cu întreaga lor aritmetică,

eliminându-se astfel una din principalele surse de erori. În plus, eliberarea

memoriei ocupate de obiecte şi tablouri se face automat, prin mecanismul de

colectare de gunoaie, evitându-se astfel încercările de eliberare multiplă a unei

zone de memorie.

Java este un limbaj cu securitate ridicată. El verifică la fiecare

încărcare codul prin mecanisme de CRC şi prin verificarea operaţiilor

disponibile pentru fiecare set de obiecte. Robusteţea este şi ea o trăsătură de

securitate. La un al doilea nivel, Java are incorporate facilităţi de protecţie a

obiectelor din sistem la scriere şi/sau citire. Variabilele protejate într-un obiect

Java nu pot fi accesate fără a avea drepturile necesare, verificarea fiind făcută

în timpul execuţiei. În plus, mediul de execuţie Java poate fi configurat pentru a

proteja reţeaua locală, fişierele şi celelalte resurse ale calculatorului pe care

rulează o aplicaţie Java.

Limbajul Java are inclus suportul nativ pentru aplicaţii care lucrează

cu mai multe fire de execuţie, inclusiv primitive de sincronizare între firele de

execuţie. Acest suport este independent de sistemul de operare, dar poate fi

conectat, pentru o performanţă mai bună, la facilităţile sistemului dacă acestea

există.

Java este dinamic. Bibliotecile de clase în Java pot fi reutilizate cu

foarte mare uşurinţă. Cunoscuta problemă a fragilităţii superclasei este

rezolvată mai bine decât în C++. Acolo, dacă o superclasă este modificată,

trebuie recompilate toate subclasele acesteia pentru că obiectele au o altă

Page 4: Prezentarea mediului Java

4

structură în memorie. În Java această problemă este rezolvată prin legarea

târzie a variabilelor, late binding, doar la execuţie. Regăsirea variabilelor se

face prin nume şi nu printr-un deplasament fix. Dacă superclasa nu a şters o

parte dintre vechile variabile şi metode, ea va putea fi refolosită fără să fie

necesară recompilarea subclaselor acesteia. Se elimină astfel necesitatea

actualizării aplicaţiilor, generată de apariţia unei noi versiuni de bibliotecă aşa

cum se întâmplă, de exemplu, cu toate celelalte ierarhii C++.

1.2. Tehnologia Java

Tehnologia Java reprezintă pe de-o parte un limbaj de programare, pe

de altă parte o platformă.

1.2.1. Limbajul de programare Java

Limbajul de programare Java este un limbaj de nivel înalt care este aşa

cum am arătat caracterizat de următoarele: simplitate, orientat pe obiecte,

distribuit, interpretat, robust, sigur, neutru din punct de vedere al arhitecturii,

portabil, performanţă ridicată, fire multiple de execuţie, dinamic. Spre

deosebire de alte limbaje de programare, în care avem de compilat sau de

interpretat un program pentru a putea fi executat într-un calculator, limbajul

Java este mai deosebit prin faptul că un program este compilat şi interpretat. Cu

compilatorul se translatează mai întâi programul într-un limbaj intermediar

denumit Java-bytecode, care este un cod independent de platformă şi este

interpretat de interpretorul platformei Java. Acest interpretor analizează şi

rulează fiecare instrucţiune Java-bytecode pe calculator. Compilarea se face o

singură dată, iar interpretarea intervine ori de câte ori este nevoie să se execute

programul. Figura 1.1. ilustrează tot acest proces de creare a unei aplicaţii

Java.

Figura 1.1. Etapele necesare în crearea şi execuţia unei aplicaţii Java

Java-bytecode se poate interpreta ca fiind instrucţiuni în limbaj maşină

pentru procesorul denumit Maşina Virtuală Java (Java Virtual Machine – Java

Page 5: Prezentarea mediului Java

5

VM, JVM). Orice interpretor Java, chiar dacă este un mediu de dezvoltare sau

este un browser Web capabil să ruleze applet-uri, este o implementare a JVM.

Java-bytecode ajută ca sintagma “scrie o singură dată, rulează oriunde” (write

once, run anywhere) să fie posibilă compilarea unui program în Java-bytecode

pe orice platformă care are un compilator Java instalat. Acest cod binar rezultat

poate fi executat pe orice implementare a Java VM. Acest lucru înseamnă că

atât timp cât un calculator are instalat Java VM, acelaşi program poate fi rulat

pe o staţie cu Windows 2000, o staţie Solaris, sau pe un Mac (Figura 1.2.).

Figura 1.2. Java VM pe diverse platforme

1.2.2. Platforma Java

O platformă este un mediu hardware sau software în care se execută

un program. Cele mai populare platforme, de exemplu Windows 2000, Linux,

Solaris, MacOS, pot fi descrise ca fiind o combinaţie dintr-un sistem de operare

şi un sistem hardware adecvat. Platforma Java diferă de celelalte platforme prin

faptul că este o platformă exclusiv software care rulează deasupra altor

platforme bazate pe hardware.

Platforma Java este compusă din două componente:

-Maşina virtuală Java (Java VirtualMachine – Java VM)

-Interfaţa de programare a aplicaţiilor Java (Java Application

Programming Interface – Java API)

Maşina virtuală Java, introdusă în sub-capitolul precedent, este baza

platformei Java şi a fost portată pe diverse platforme bazate pe hardware.

Java API este o colecţie de componente software care furnizează multe

posibilităţi utile, cum ar fi utilitare pentru interfaţa grafică cu utilizatorul. Java

Page 6: Prezentarea mediului Java

6

API este grupată în biblioteci de clase şi interfeţe, aceste biblioteci purtând

numele de pachete (packages).

Figura următoare (Figura 1.3.) descrie un program care rulează pe

platforma Java. După cum se vede Java API şi Java VM izolează programul de

partea hardware a sistemului.

Figura 1.3. Platforma Java şi dezvoltarea unei aplicaţii

Codul nativ este codul care după compilare, (codul compilat) rulează

pe o platformă hardware specifică. Deoarece este un mediu independent de

platformă, platforma Java este mai lentă decât codul nativ, totuşi,

compilatoarele mai inteligente, interpretoarele bine configurate, şi

compilatoarele de bytecode pot să fie suficient de rapide, aproape ca şi codul

nativ fără să afectăm portabilitatea programului.

1.2.3. Aplicaţii în Java

Cele mai întâlnite tipuri de aplicaţii scrise în limbajul de programare

Java sunt applet-urile şi aplicaţiile de sine stătătoare (stand alone).

Un applet este un program care se supune unor convenţii şi rulează

într-un browser Web care suportă Java.

O aplicaţie de sine stătătoare este un program independent care rulează

direct pe platforma Java.

In Java se poate realiza şi un applet-aplicatie, appletcation care funcţie

de context poate fi tratat ca şi:

-applet de către un browser sau appletviewer

-aplicaţie grafică de către interpretorul Java.

Un alt tip de aplicaţii Java sunt servlet-urile. Un servlet se aseamănă

cu un applet, prin faptul că rulează în interiorul unei alte aplicaţii care suportă

mediul Java, şi respectă regulile impuse de aceasta. În cazul servlet-ului

aplicaţia este un server de Web. Servlet-urile Java sunt folosite pentru

construirea de aplicaţii Web interactive, fiind un înlocuitor al script-urilor CGI.

Toate aceste tipuri de aplicaţii Java sunt suportate de către Java API

prin intermediul pachetelor de componente software care oferă o gamă largă de

funcţionalităţi. Cele mai importante trăsături oferite de acestea se referă la

trăsături:

Page 7: Prezentarea mediului Java

7

-de bază, obiecte, şiruri, fire de execuţie, lucrul cu numere, operaţii

input/output, structuri de date, informaţii sistem, data şi timpul, etc.

-applet-uri, setul de convenţii folosite de applet-uri.

-reţea, lucrul cu URL-uri, lucrul cu protocoalele TCP (Transmission

Control Protocol), UDP (User Datagram Protocol), şi IP (Internet Protocol).

-internaţionalizare, ajută la scrierea de programe care pot fi localizate

oriunde pe glob. Astfel programele se pot adapta automat la setările locale şi

conţinutul va fi afişat în limba locală.

-securitate, de nivel mic sau mare, care cuprinde semnătura

electronică, gestiune de chei publice şi private, controlul accesului, şi

certificarea.

-componente software, sunt cunoscute sub denumirea de JavaBeans,

sunt componente software reutilizabile care se pot integra într-o arhitectură de

componente existentă.

-serializare de obiecte, permite persistenţa obiectelor şi comunicaţia

folosind tehnologia RMI (Remote Method Invocation).

-acces la baze de date, JDBC (Java Database Connectivity) asigură

accesul la o gamă foarte largă de baze de date relaţionale.

Platforma Java mai cuprinde şi API-uri pentru grafică 2D şi 3D,

accesibilitate, servere, colaborare, telefonie, tehnica vorbirii, animaţie, şi multe

altele. Figura următoare (Figura 1.4.) arată modul de alcătuire a platformei

Java 2 SDK (Software Development Kit) Standard Edition.

Figura 1.4. Java 2 SDK, Standard Edition, versiunea 1.3.

Mediul de execuţie Java 2 (JRE – Java Runtime Environment) este

compus din maşina virtuală Java, clasele nucleu, şi alte fişiere. Java 2 SDK

include JRE şi instrumentele de dezvoltare cum ar fi compilatoarele şi

debuggerele.

Page 8: Prezentarea mediului Java

8

1.2.3.1. Descrierea pachetului JDK

Este important ca înainte să trecem la realizarea unei aplicaţii Java să

discutăm despre uneltele şi bibliotecile de care dispunem.

La baza dezvoltării unui program Java stă mediul de dezvoltare pus la

dispoziţie de firma Sun. Acesta este Java Developer Kit (JDK) şi trebuie

considerat ca mediu de referinţă în programarea Java. Acest kit a evoluat,

începând ce versiunea JDK 1.0 şi apoi JDK 1.1, JDK 1.2, până la versiunea

JDK 1.3, actualmente apărând versiunea beta pentru 1.4.

Se consideră important ca un programator Java să cunoască mai întâi

uneltele standard şi apoi să treacă la utilizarea uneltelor mai performante.

Mediul JDK conţine pe de-o parte o serie de biblioteci de clase Java

necesare scrierii unui program şi pe de altă parte un set de utilitare necesare

compilării, testării, execuţiei şi documentării unei aplicaţii Java.

Un fişier cu extensia *.class, reprezintă unitatea fundamentală a unui

program executabil Java. O bibliotecă de clase cuprinde o serie de clase ce au

un numitor comun. O astfel de bibliotecă este cunoscută în Java sub numele de

package. JDK-ul include câteva package-uri fundamentale, care conţin clase

fără de care nu se pot dezvolta aplicaţii Java performante. Package-urile Java

incluse în JDK, formează principalul API- Application Programming Interface

numit şi Java Core. Orice alt mediu care poate executa aplicaţii Java diferit de

mediul JDK trebuie să includă acest API. Pe lângă aceste pachete fundamentale

grupate în Java Core utilizatorul poate folosi şi altele dezvoltate de către

utilizatori. Trebuie însă să se asigure că aceste pachete adiţionale, sunt

disponibile şi pe platforma pe care aplicaţia se execută, nu numai unde aceasta

a fost creată.

1.2.3.2. Pachete de bază JDK 1.3.

JDK 1.3. conţine următoarele package-uri de bază:

package java.applet

Conţine clase necesare dezvoltării unui applet, a unui program Java care se

execută în cadrul unui browser WWW sau este rulat cu appletviewer-ul.

package java.awt, java.awt.datatransfer, java.awt.event, java.awt.image

Sunt utilizate pentru dezvoltarea de interfeţe grafice standard.

package java.beans

Acesta include clasele necesare lucrului cu stream-uri (comunicare cu

device-uri Input/Output, comunicare cu consola, accesul la fişiere, etc.).

Page 9: Prezentarea mediului Java

9

package java.lang

Conţine clasele fundamentale fără de care nici un program Java nu poate

exista. Utilizarea unei clase din oricare alt pachet decât java.lang într-un

program Java, se specifică în clar prin directiva import nume_pachet. . Acest

pachet este inclus automat de către compilator fără a fi nevoie de precizări

suplimentare.

package java.lang.reflect

Este utilizat pentru a putea face o verificare a entităţilor Java, a

claselor/obiectelor Java. Această verificare este foarte utilă în cazul dezvoltării

de aplicaţii flexibile şi dinamice.

package java.math

Se foloseşte pentru utilizarea de funcţii matematice standard implementate.

package java.net

Este utilizat pentru programarea în reţea şi conţine o sumedenie de clase

pentru aceasta.

package java.rmi, java.rmi.dgc, java.rmi.registry, java.rmi.server

Aceste pachete sunt utilizate pentru crearea unor aplicaţii Java ce lucrează

în sisteme distribuite ( RMI – Remote Method Invocation ). Facilitează apelul

unor metode din obiecte disponibile pe fiecare din calculatoarele conectate în

reţea.

package java.security, java.security.acl, java.security.interfaces

Sunt pachete ce privesc asigurarea unui mecanism de securitate al

sistemului software dezvoltat.

package java.sql

Este utilizat pentru lucrul cu bazele de date.

package java.text

Este utilizat pentru lucrul cu texte.

package java.util

Oferă suport pentru lucrul cu liste, vectori, dicţionare, informaţii legate de

dată şi timp, etc.

package java.util.zip, java.util.jar

Sunt pachete necesare atuci când se lucrează cu algoritmi de compresie şi

decompresie.

Page 10: Prezentarea mediului Java

10

package java.awt.color

Furnizează clase pentru lucrul cu culori.

package java.awt.font

Clase pentru lucrul cu fonturi.

package java.awt.geom

Frunizează clase 2D pentru lucrul cu geometrie bidimensională.

package java.awt.im

Clase şi interfaţe pentru metode de intrare.

package javax.naming, javax.naming.directory, javax.naming.event,

javax.naming.ldap, javax.naming.spi

Furnizează o interfaţă pentru dezvoltarea metodelor de intrare care pot fi

utilizate cu orice JRE.

package javax.sound.midi

Furnizează interfeţe şi clase pentru secvenţe audio de intrare/ieşire.

package javax.sound.sampled

Furnizează interfeţe şi clase pentru captarea, prelucrarea şi rularea

fişierelor audio.

package javax.swing

Furnizează un set de componente grafice pentru toate limbajele Java, care

lucrează la fel pe orice platformă.

package org.omg.CORBA

Furnizează maparea API-ului OMG CORBA în limbajul de programare

Java , incluzând clasa ORB care este implementată pentru ca un programator

să o poată utiliza complet ca şi un Object Request Broker (ORB).

Pe lângă API-ul Java Core pachetul JDK pune la dispoziţia programatorului

o serie de unelte necesare dezvoltării, testării, analizei şi documentării

programelor.

Principalele unelte utilizate în Java sunt:

javac – Java Language Compiler

Page 11: Prezentarea mediului Java

11

Este compilatorul Java care transformă sursele text având extensia *.java

scrise în limbaj de programare Java, în cod executabil pe maşina virtuală Java

(JVM), în bytecode, adică fişiere de tip class.

Exemplu:

javac nume_fişier.java

java – Java Interpreter

Interpretorul Java execută programele Java, realizând nivelul de JVM

deasupra platformei reale. Prin lansarea în execuţie a acestui utilitar se porneşte

de fapt JVM. Programul emulează JVM convertind instrucţiunile JVM din

bytecode în instrucţiuni ale maşinii reale.

Observaţie: Această unealtă este utilă doar pentru aplicaţiile stand- alone

sau appletcation.

javadoc

Acest program generează documentaţia programelor Java în format html.

Documentarea se face pa baza comentariilor specifice Java din program şi acest

program se aplică doar asupra fişierelor sursă Java.

Exemplu:

javadoc nume_fişier.java Orice maşină virtuală Java (fie interpretor fie browser) se presupune că are

acces la fişierele bytecod existente în mediul JDK. Aceasta în cazul în care se

formează versiuni. Variabila de mediu CLASSPATH este cea care defineşte

căile de acces la biblioteci.

1.3. Descrierea limbajului Java prin comparaţie cu

limbajul C/C++

Limbajul C şi limbajul Java sunt foarte asemănătoare.

Cuvintele cheie şi operatorii sunt moşteniţi de Java din C, în mod particular

tipurile de date, fluxurile de control, toţi operatorii constituie corpul tuturor

aplicaţiilor.

Restul aplicaţiei Java este reprezentat de construcţii orientate obiect şi se

referă mai mult la cadrul de lucru şi proiectare al aplicaţiei şi mai puţin la

implementare.

O aplicaţie Java este formată doar din clase, o singură clasă implementând

metoda main. Spre deosebire de C++, limbajul Java este în întregime orientat

pe obiecte (OOP – Object Oriented Programming). Java este robust, mărind

Page 12: Prezentarea mediului Java

12

gradul de siguranţă al codului, existând două nivele de verificare: unul la

compilare şi unul la rulare.

Accesul la tablourile Java este verificat la rulare, eliminând astfel

accesul accidental sau maliţios în afara domeniului tabloului.

Pentru a crea şi a lansa în execuţie o aplicaţie sunt necesare mai multe

operaţii.

În continuare sunt prezentate etapele necesare dezvoltării şi lansării în

execuţie a unei aplicaţii stand- alone. Acestea sunt:

-scrierea codului

-compilarea

-interpretarea şi lansarea în execuţie

Aceste etape sunt reprezentate sugestiv in diagrama din Figura 1.1.

Editarea unui program Java se face utilizând orice editor simplu de text,

care salvează datele în format text. Este important ca fişierul în care se salvează

programul să aibă numele clasei respective (doar în cazul în care clasa este

declarată publică). Iar în cazul dezvoltării aplicaţiilor stand-alone este

obligatoriu ca în clasă să fie metoda main() de forma:

public static void main(String args[] ){…..}

Această metodă trebuie să existe în orice aplicaţie Java, fiind prima

metodă apelată de interpretor când se lansează în execuţie un program Java.

Exemplu de program:

class AplicatieJava { public static void main (String args []){ System.out.println(“Aplicatie demonstrativa !”);

} }

Acest program va fi salvat cu numele AplicatieJava.java însă nu

obligatoriu pentru că, clasa nu este publică.

În continuare se va realiza compilarea programului prin comanda:

javac AplicatieJava.java

Dacă compilarea se face cu succes va rezulta un fişier cu extensia class:

AplicatieJava.class, fişier care conţine programul executabil (bytecod) Java.

După ce am obţinut fişierul cu extensia class se lansează în execuţie

folosind interpretorul Java cu comanda:

Page 13: Prezentarea mediului Java

13

java AplicatieJava În urma acestei comenzi se va afişa la consolă:

„Aplicatie demonstrativa !”

Vom face în continuare o scurtă trecere în revistă a principalelor

componente comune între limbajul C şi Java.

Cuvintele cheie şi operatorii dau simţul şi expresivitatea unui limbaj

de programare ele fiind luate de Java din C. Java reţine elementele coincise

lipsite de posibile erori şi compacte ce duc la dezvoltarea aplicaţiilor eficiente.

Cuvintele cheie comune celor două limbaje constituie nucleul

aplicaţiei. Aceste cuvinte cheie împreună cu operatorii determină majoritatea

construcţiilor folosite în realizarea funcţiilor dorite.

Cadrul de realizare a aplicaţiei poate fi obiectual dar implementarea este foarte

aproape de cea din C.

Limbajul Java foloseşte şi cuvinte cheie specifice C++ având şi propriile

cuvinte cheie (package, import, extends, instanceOf, super, etc.)

Operatorii sunt clasificaţi în acelaş mod ca şi cei din limbajul C dar

sunt mai clar definiţi. Dacă în limbajul C se permite a converti o valoare

numerică în una booleană expresia (x=10) fiind convertită în valoarea booleană

true, în limbajul Java acest lucru nu este posibil. In limbajul Java se determină

un cost pornind de la un tabel de costuri cu 16 intrări care permite conversia

între tipuri de date. Costul 0 (zero) este pentru conversia unui tip în el însuşi.

Dacă costul este mai mare de 10 atunci precizia se pierde semnalizându-se un

avertisment.

Compararea a două obiecte din punct de vedere al conţinutului lor se face cu

metoda equals(), operatorul de comparaţie, == comparând doar adresele

obiectelor respective. In plus Java introduce operatorul >>> ca şi operator de

deplasare dreapta fără extensia semnului.

Nu se folosesc operatorii sizeof pentru determinarea dimensiunii, indirectare *,

adresare &, acces -> iar operatorul virgulă , ca şi evaluare secvenţială se mai

poate folosi doar în structuri de control de tip for.

Există patru modalităţi de a considera variabilele în Java:

-declarare;

boolean ok; float aria;

-asignare, ce permite asignarea unei valori la o variabilă declarată în

prealabil:

aria=10.5;

Page 14: Prezentarea mediului Java

14

-iniţializări, ce sunt asignări combinate cu declaraţii;

boolean ok=true; -cast-uri, dacă dorim să plasăm o valoare de un tip intr-o variabilă de alt tip

lucru ce e permis doar pentru tipuri compatibile:

int iaria = (int) aria; Se observă că şi în acest caz Java este mai robust.

Identificatorii respectă aceleaşi reguli ca şi în limbajul C lungimea lor

fiind ori cât de mare recomandându-se ca:

-numele clasei, a variabilelor din metode şi a parametrilor să înceapă

cu literă mică

-numele metodelor să înceapă cu _

-constantele să se scrie cu litere mari.

Constantele se declară în afara corpului funcţiilor din cadrul claselor

în general fiind prefixate de cuvintele cheie public static şi final însemnând că

asignarea e finală publică şi nu poate fi modificată. Fiind statice accesul la

aceste constante se va face prefixându-le cu numele clasei si operatorul punct.

Constanta de tip caracter se mai poate reprezenta şi ca o notaţie de tip Unicode

de forma: ‘\uxxxx’. Există unele modificări de asemenea la secvenţele escape.

O expresie este ori ce combinaţie de operatori şi operanzi care trebuie

să fie evaluată pentru a produce o valoare. Java a adoptat puterea şi facilităţile

expresiilor din C/C++ cu unele diferenţe ţinând cont de faptul că Java este

independent de platformă şi internaţional. De aceea tipurile de date primitive

sunt erxtrem de clar şi precis definite faţă de limbajul C ele fiind:

-byte, reprezintă 1 octet ca o valoare cu semn

-boolean, este pe bit având două valori, true şi false neputând fi

convertit în alt tip de dată şi nu poate fi obţinut din alt tip de dată

-char se reprezintă pe 2 octeţi în Unicode respectând regulile de

conversie la întregi din C

-short, int, long sunt întregi cu semn pe 16, 32 şi 64 biţi împărţirea cu

zero activând excepţia ArithmeticException

-double, float sunt reali pe 64 respectiv 32 de biţi. Există constante

predefinite:

-POSITIVE_INFINITY

-NEGATIVE_INFINITY ce apar la cazurile de depăşire când nu se

declanşează excepţii.

Java a adoptat standardul IEEE 754 prin care toate tipurile de date au o

lungime fixă evitând ambiguităţi şi independenţa faţă de platformă.

Limbajul Java oferă de asemenea pentru fiecare tip elementar câte o clasă ale

căror instanţe reprezintă obiecte similare valorilor cu tipuri elementare. (Short,

Page 15: Prezentarea mediului Java

15

Integer, Float, Boolean, etc.) Metodele din aceste clase permit diverse operaţii

ce pot fi efectuate cu obiectele respective.

Structurile de control din Java oferă abilitatea de a selecta diferite

ramuri de urmat funcţie de unele puncte de decizie precum şi efectuarea de

cicluri în program. Aceste structuri de control au fost adoptate de Java din C cu

următoarele observaţii:

-condiţia pe baza căreia se ia decizia trebuie să fie o expresie de tip boolean

-instrucţiunile break şi continue pot avea şi variabile ca şi etichete

permiţând forţarea ieşirii nu neapărat imediat după ea respectiv reluarea unui

ciclu exterior având eticheta precizată

-s-a eliminat instrucţiunea goto rezervându-se însă cuvântul, etc.

Pentru tratarea excepţiilor s-au introdus pe lângă instrucţiuni specifice

C++ şi alte instrucţiuni Java. Astfel se folosesc instrucţiunile try, catch, throw,

throws şi finally.

Alte instrucţiuni specifice limbajului Java sunt synchronized, package

şi import.

Tablourile şi şirurile de caractere sunt tratate în Java ca nişte obiecte de

clasă primară ce nu sunt însă supuse la erori şi confuzii ca cele din C++.

Tablourile în Java pot deci păstra la fiecare indice un obiect sau o valoare

primitivă toate datele fiind însă de acelaş tip. Tablourile în Java :

-se declară oferind o referinţă

-se creează alocându-se spaţiu de memorie dinamic

-se asignează valori tabloului

-se distrug când nu mai sunt folosite.

Tablourile diferă faţă de cele din limbajul C prin următoarele:

-se creează folosind operatorul new, dimensiunea tabloului fiind introdusă

doar în expresia new,

int iTablou[]= new int[5]; -fiind derivate direct din clasa Object această clasă rădăcină a ierarhiei

defineşte mai multe metode şi date astfel încât toate tablourile memorează

lungimea de alocare într-o variabilă numită length care poate fi accesată ori

când astfel,

int lungTabl= iTablou.length;

-ele sunt protejate la depăşirea indicilor atât inferior cât şi superior

decanşându-se o întrerupere Java ArrayIndexOutOfBoundException

-tablorile multidimensionale se declară ca şi tablouri de tablouri putând

aloca dimensiune specifică fiecărei coloane ulterior

-copierea tablourilor se face folosind metoda arraycopy().

Page 16: Prezentarea mediului Java

16

Deşi nu avem pointeri în Java când se dă ca şi parametru într-o metodă un

tablou practic se transferă referinţa către acel tablou şi nu valoarea

componentelor.

Aşa cum am mai spus şirurile de caractere reprezintă obiecte derivate din

clasa Object. Ele se implementează cu ajutorul claselor:

-String, pentru şiruri constante

-StringBuffer, pentru şiruri modificabile

-StringTokenizer, permite împărţirea unui şir pe componente pentru a putea

fi extrase.

Un obiect al clasei String poate fi privit ca şi un tablou de caractere

reprezentate în Unicode el nefiind terminat printr-un octet cu valoarea 0 ca şi în

limbajul C.

Toate aceste clase specifice şirurilor de caractere din Java posedă diverse

metode ce permit prelucrarea lor.

Dacă tablourile odată ce au fost create îşi păstrează dimensiunea, în

cadrul clasei Vector putem adăuga sau elimina în continuare elemente. Vectorii

se folosesc în locul tablourilor atunci când:

-avem un număr variabil de elemente şi vrem să adăugăm sau să ştergem

unele elemente

-elementele trebuie să fie obiecte iar datele primare pot fi convertite uşor în

obiecte folosind clasele Java

-dorim să determinăm uşor unde e plasat un obiect şi care e poziţia lui.

Vectorii reprezintă o facilitate extrem de utilă oferită de către limbajul Java

în realizarea unor aplicaţii care utilizează date variabile sau transferă un număr

variabil de argumente la o funcţie.

Metodele (funcţiile) din Java sunt foarte asemănătoare cu cele din

limbajul C/C++ doar că Java a simplificat lucrurile prin faptul că metodele sunt

incluse doar în clase. In acest mod metodele normale vor fi invocate folosind

un obiect instanţiat iar cele statice prin intermediul numelui clasei în care au

fost definite. Metodele statice permit definirea de funcţii utilitare care pot fi de

sine stătătoare dacă declarăm şi clasa publică.

Si în limbajul Java metoda main() permite utilizarea argumentelor în

linia de comandă având un singur argument de tip tablou de şiruri de caractere.

Practic nu este nevoie de un alt parametru care să specifice numărul de

argumente, acesta fiind păstrat în variabila length asociată tabloului iar

argumentul dependent de sistemul de operare a fost eliminat pentru a păstra

facilitatea multiplatformă a limbajului. Argumentele se preiau ca şi şiruri de

caractere urmând a fi apoi convertite la alte tipuri cu metode oferite de către

limbaj. Java nu mai transferă ca prim argument numele aplicaţiei.

Page 17: Prezentarea mediului Java

17

Pointerii nu există în limbajul Java ei creând multe probleme în

limbajul C în cazul în care ei nu erau bine gestionaţi de către programatori.

Numele unor tablouri sau obiectele neinstanţiate din Java sunt însă similare ca

şi funcţionalitate cu pointerii din C. Aproape toate cerinţele se pot rezolva asfel

privind accesul la date prin adrese cu următoarele excepţii:

-nu se poate realiza transferul datelor în cadrul metodelor prin adresă

deşi tablorile şi obiectele sunt transferate prin adresă, implicit în funcţia apelată

făcându-se o copie a lor. Dacă se doreşte o modificare a unor valori se vor

folosi metode care returnează valori.

-nu se pot folosi pointeri la funcţii, această funcţionalitate putând fi

obţinută cu ajutorul funcţiilor virtuale sau a moştenirii. Tabelele de pointeri

spre funcţii pot fi realizate cu ajutorul variabilelor neinstanţiate ale clasei

Object precum şi cu ajutorul identificatorilor de tip run-time.

Intre bibliotecile standard oferite de către limbajul C şi ierarhia de

clase oferită de către limbajul Java există similarităţi funcţionale, clasele Java

adăugând multe alte facilităţi.

Dacă în limbajul C++ clasele au fost adăugate peste un limbaj

secvenţial, limbajul C, limbajul Java este un limbaj pur obiectual totul fiind

implementat în cadrul claselor. Pentru a lucra cu un obiect este nevoie de o

clasă care să descrie structura şi funcţionalitatea obiectului. Astfel definirea

unei clase în Java se face după cum urmează:

[listă_modoficatori] class idClasă [extends idClasăBază] [implements lista_ interface] { corp_clasă }

Din definiţie se observă că obligatoriu pentru a defini o clasă trebuie

să avem cuvântul cheie class.

Pentru a defini o clasă dintr-o altă clasă de bază sau supreclasă se foloseşte

cuvântul cheie extends urmat de numele clasei de bază. În Java spre deosebire

de C++ poate exista o singură clasă de bază.

O interfaţă în Java reprezintă un fel de clasă abstractă în care nici una din

metode nu a fost definită ele fiind doar declarate fără a utiliza cuvântul cheie

abstract (lipseşte corpul metodei dar s-a declarat metoda).

Ca şi concluzie corpul clasei conţine o listă de declaraţii atribute, metode şi

constructori. Totalitatea atributelor caracterizează starea unui obiect din acea

clasă.

Totalitatea metodelor reprezintă interfaţarea clasei şi caracterizează

funcţionalitatea clasei. Constructorii unei clase au un scop bine definit în

iniţializarea unui obiect din acea clasă.

Page 18: Prezentarea mediului Java

18

Diferenţele principalele între clasele Java şi cele C++ constau din:

-omiterea operatorului de scop, ::, la definirea funcţiilor membre

-abilitatea din C++ de a folosi variabile multiple folosind un singur

specificator de acces

-utilizarea cuvântului cheie extends în Java pentru procesul de derivare

-utilizarea cuvântului cheie super în Java pentru apelul constructorilor

sau a altor metode şi variabile din clasa aflată mai sus în ierarhie

-prin utilizarea conceptului de package Java a schimbat scopul

modificatorului protected astfel încât clasele din acelaş package au acces la

variabilele protected că sunt sau nu derivate ele fiind considerate friendly.

In Java se poate utiliza metoda finalize() care dacă se declară în cadrul

unei clase ea va fi apelată chiar înainte ca procesul de garbagecollection să

distrugă obiectul din memorie. Aici practic se pot închide fişiere care au fost

uitate deschise sau elibera alte resurse cum ar fi soclurile, socket-uri.

Operatorul instanceOf ne arată dacă un obiect aparţine sau nu unei

clase.

Dacă dorim ca o clasă să nu mai poată fi derivată ea se declară de tip

final, compilatorul putând efectua diferite optimizări. In acest caz şi metodele

pot fi declarate de tip final ceea ce înseamnă că ele vor fi legate în mod static

adică stau pe postul funcţiilor de tip inline din C++.

In cazul moştenirii upcastingul permite crearea unui obiect referit de o

clasă derivată prin instanţierea unui obiect folosind clasa de bază.

Downcastingul se face doar prin folosirea operatorului cast permiţând conversia

unui tip de bază într-unul derivat.

Java permite folosirea unor pachete predefinite dar şi crearea unor pachete

proprii în cazul în care se doreşte a oferi o mai mare funcţionalitate procesului

de dezvoltare a unei aplicaţii.

Grafica în programare s-a impus pornind de la consideraţia că o imagine

înseamnă mai mult decât 1000 de cuvinte. Iniţial grafica în Java folosind

pachetul AWT (Abstract Window Toolkit) s-a bazat pe ideea folosirii unui

singur standard GUI (Graphic User Interface) standard ce a pornit de la

dezvoltatorii Unix fiind cunoscut sub numele CDE, Common Desktop

Environment. AWT foloseşte principiul Common Functionality Specific

Implementation derivat din CDE urmărind să conserve aşa numitul look and

feel caracteristic platformei specifice. Acest pachet a suferit cele mai mari

modificări pornind de la versiunile Java dezvoltate de-a lungul timpului.

Versiunea 1.0 cu pachetul java.awt se baza pe aşa numitele handlere definite în

interiorul componentelor grafice iar de la versiunea 1.1 pachetul java.awt.event

permite definirea handlere-lor în alte clase asocierea făcându-se cu diferite

metode. Grafica bazată pe swing-uri oferă un nou nivel mai profesional în

realizarea aplicaţiilor grafice.

Page 19: Prezentarea mediului Java

19

Acest mecanism al utilizării graficii îl întâlnim şi în limbajul C++ unde

după cum se ştie grafica nu este standardizată.

Lucrarea de faţă consideră noile elemente introduse de Java odată cu

utilizarea noului concept Java 2 Enterprise Edition. Se vor prezenta principalele

facilităţi J2EE precum şi unele exemple privind dezvoltarea de aplicaţii

dedicate domeniului procesării imaginilor şi domeniului multimedia.

1.4. Bibliografie

1. Irina Atanasiu, B. Costinescu, O. A. Drăgoi, F.I. Popovici,

Limbajul Java o perspectivă pragmatică, Computer Libris Agora, 1998

2. William Buchanan, Mastering Java, MacMillan, 1998

3. Judy Bishop, Java Gently +Programming Principles Explained, 1996

4. F. Mircea Boian, Programarea distribuită în Internet. Metode îi

aplicaţii, Editura Albastră, 1997

5. M. Daconta, Java for C/C++ Programmers, John Wiley &Sons, 1996

6. N. Fawcet, Terry Ridge, Java a Practical Guide, Butterworth

Heinemann, 1997

7. Cay Horstmann, Computing Concepts with Java, John Wiley&Sons,

1998

8. Laura Lemay, Teach Yourself Java in 21 Days, SAM, 1998

9. Mircea-Florin Vaida, Procesarea Imaginilor Medicale. Ingineria

programării în vederea dezvoltării de aplicaţii în domeniul bio-

medical, Cartea Cărţii de Stiinţă, 2000

10. Călin Văduva, Programarea în Java, Editura Albastră, 1999

11. Russel Winder, Graham Roberts, Developing Java Software, John

Wiley &Sons, 1998