Upload
alex9216
View
33
Download
0
Embed Size (px)
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++
Citation preview
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
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ă
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ă
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
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
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:
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.
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.).
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.
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
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
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:
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;
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,
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().
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.
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ă.
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.
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